2012-03-28 17 views
22

Spring Güvenlik kullanarak OpenID kimlik doğrulamasıyla bir uygulama yapıyorum. Kullanıcı giriş yaptığında, oturumunda bazı yetkililer yüklenir.Spring Security ile kullanıcı güncellemesinde yetkililer nasıl yeniden yüklenir?

Diğer kullanıcıların yetkililerini (iptal etme, rol ekleme) değiştirebilen tam kullanıcı hakkı var. Sorum şu: Kullanıcı oturum yetkililerini dinamik olarak nasıl değiştirebilirim? (Başka bir Kullanıcı oturumunu değiştirmek istediğim için SecurityContextHolder kullanamazsınız).

Basit bir yöntem: kullanıcı oturumunu geçersiz kılar, ancak nasıl yapılır? Daha iyi bir yol: kullanıcı oturumunu yeni yetkililerle yenilemek, ancak nasıl yapmalı?

cevap

6

Önemli nokta - kullanıcılara SecurityContext s erişebilmeniz gerekir.

sen servlet ortamında ve sizin securityContextPersistenceFilter yılında securityContextRepository olarak HttpSession kullanıyorsanız, o zaman bahar en SessionRegistry ile yapılabilir. Kullanıcıyı yeniden yetkilendirmeye zorlamak için (sessiz izin iptalinden daha iyi olmalı), HttpSession değerini geçersiz kılar. Eğer iş parçacığı yerel securityContextRepository kullanıyorsanız

<listener> 
    <listener-class> 
     org.springframework.security.web.session.HttpSessionEventPublisher 
    </listener-class> 
</listener> 

web.xml için HttpSessionEventPublisher eklemeyi unutmayın, o zaman SecurityContext s kayıt yönetmek için springSecurityFilterChain için özel filtre eklemek gerekir. Bunu yapmak için sade fasulye springSecurityFilterChain yapılandırmasını kullanmalısınız (security ad alanı kısayolları olmadan). Özel filtrelerle düz fasulye yapılandırmasıyla, kimlik doğrulama ve yetkilendirme üzerinde tam kontrol sahibi olacaksınız.

bazı bağlantılar, bunlar tam sorununuzu (hayır OpenID) çözmek değil, ama yararlı olabilir: servlet ortamında

  • it's plain-bean spring config çalışma örneği
  • real life plain-bean spring config for X.509 auth için

    • NIH session registry, sen ile başlayabilir X.509 yerine OpenID kullanmak için değiştirin ve değiştirin.
  • 7

    sayesinde bana çok yardımcı! SessionRegistry ile, oturumları geçerli kullanıcılarla değiştirmek için kullanıcıyla karşılaştırmak üzere getAllPrincipals()'u kullanabilirim. Bir oturum varsa, yeniden kimlik doğrulamasını zorlamak için oturumunu expireNow() (SessionInformation) kullanarak geçersiz kılabilirim.

    Ama securityContextPersistenceFilter yararlılığını anlamıyorum?

    DÜZENLEME: dinamik bir çıkış yapıp tabii giriş yapmaya gerek kalmadan, (bunlar herhangi bir nedenle, değişiklik olduğunda) Kullanıcının otoriteleri oturum güncellemeniz gerekirse

    // user object = User currently updated 
    // invalidate user session 
    List<Object> loggedUsers = sessionRegistry.getAllPrincipals(); 
    for (Object principal : loggedUsers) { 
        if(principal instanceof User) { 
         final User loggedUser = (User) principal; 
         if(user.getUsername().equals(loggedUser.getUsername())) { 
          List<SessionInformation> sessionsInfo = sessionRegistry.getAllSessions(principal, false); 
          if(null != sessionsInfo && sessionsInfo.size() > 0) { 
           for (SessionInformation sessionInformation : sessionsInfo) { 
            LOGGER.info("Exprire now :" + sessionInformation.getSessionId()); 
            sessionInformation.expireNow(); 
            sessionRegistry.removeSessionInformation(sessionInformation.getSessionId()); 
            // User is not forced to re-logging 
           } 
          } 
         } 
        } 
    } 
    
    +0

    'servlet ortamında' HttpSession' içine 'SecurityContext' koyacağız varsayılan olarak securityContextPersistenceFilter'. "SessionRegistry" kutusundan çıktığınız için bu filtreyi özelleştirmeniz gerekmez. – alexkasko

    +0

    Sunuculu ortamdayım, securityContextPersistenceFilter öğesinin özelleştirilmesinin yararı nedir? – Aure77

    +0

    farklı durumlar mümkündür, örn. 'HttpSession's devre dışı bırakılmış ve iplik-yerel depolama istemiyorsunuz. Yani kendi uygulamanızı 'securityContextRepository' kullanabilirsiniz. Eğer HttpSession depolama alanı ihtiyaçlarınızı karşılarsa, o zaman faydası yoktur. – alexkasko

    22

    , sadece gereken SecurityContextHolder Yayındaki Authentication nesnesini (güvenlik belirteci) sıfırlayın.

    Örnek:

    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    
    List<GrantedAuthority> updatedAuthorities = new ArrayList<>(auth.getAuthorities()); 
    updatedAuthorities.add(...); //add your role here [e.g., new SimpleGrantedAuthority("ROLE_NEW_ROLE")] 
    
    Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(), auth.getCredentials(), updatedAuthorities); 
    
    SecurityContextHolder.getContext().setAuthentication(newAuth); 
    
    +5

    Eh, neredeyse benim için çalıştı. Bu "auth" değişkeni, oturum açmış kullanıcıyla ilgilidir (yani, ben). "X" olarak giriş yaptım ve "y" yetkililerini iptal etmek istiyorsam, Authentication'ın nesnesini o belirli kullanıcıdan nasıl alabilirim? – Paulo

    İlgili konular