2013-02-05 53 views
10

Kimlik Doğrulama/UserDetailsImpl nesnesinde List<GrantedAuthority>'u ayarlamak zaten var mı? Uygulamamda, oturum açmak için iki tane güvenlik katmanım var (bir kullanıcı benim oturum açma kimlik doğrulayıcımı kullanır, UsernamePasswordAuthenticationToken kullanarak Authentication nesnesini kullanıyorum) ve bir kullanıcı için yanıt sorulması gereken bir "sorun sorusu" özel bir soru.Yay Güvenliği: Set GrantedAuthorities

Yapmak istediğim, kullanıcı giriş sorusu yanıtını verdikten sonra, oturum açma işlemi sırasında oluşturulan geçerli List<GrantedAuthority>'a GrantedAuthority eklemek.

Bu mümkün mü?

+0

bir şey UserDetails uygulama ne sınıftır. İlkbahar, UserDetailsImpl adlı bir sınıf sağlar. LDAP sürümü, bir LdapUserDetailsImpl örneği oluştururken JdbcDaoImpl, kullanıcı sınıfının bir örneğini oluşturur. Bu yüzden yetkilileri değiştirip değiştiremeyeceğinize, hangi tip nesneye geri döndüğünüze bağlı. Asla, Spring tarafından sağlanan UserDetails uygulamasından tam olarak, verilen yetkililer için değişmez setler gibi şeylerden dolayı hiç kullanmadım. Bu, değişebilen bir şey. –

cevap

8

aşağıdaki kodla yapabilirsiniz: Bu konuda açıklığa kavuşturmak için

Collection<SimpleGrantedAuthority> oldAuthorities = (Collection<SimpleGrantedAuthority>)SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 
SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_ANOTHER"); 
List<SimpleGrantedAuthority> updatedAuthorities = new ArrayList<SimpleGrantedAuthority>(); 
updatedAuthorities.add(authority); 
updatedAuthorities.addAll(oldAuthorities); 

SecurityContextHolder.getContext().setAuthentication(
     new UsernamePasswordAuthenticationToken(
       SecurityContextHolder.getContext().getAuthentication().getPrincipal(), 
       SecurityContextHolder.getContext().getAuthentication().getCredentials(), 
       updatedAuthorities) 
); 
0

UserDetails.getAuthorities() yöntemi yalnızca Collection<GrantedAuthority> nesnesini döndürür. Yeni otoritenizi bu koleksiyona eklemek için uygun Collection yöntemini kullanabilirsiniz. ( )

+1

Koleksiyona eklenemiyor -> DeğiştirilemiyorKoleksiyon – Slavak

+0

@Slavak Bu gerçekten UserDetails için kullandığınız uygulamaya bağlı olacaktır. Kullanıcı sınıfını, uygulamamızdaki org.springframework.security.core.userdetails adresinden kullanmıyoruz. Açıktır ki, yetkilileri ayarlamak veya değiştirmek, koleksiyonun değişmez olduğu bir uygulamayı kullanmak ve setAuthorities() yönteminin (UserDetails arabiriminde söz verilmeyen) kullanılması, sorunun cevabının yalnızca hayır olduğu anlamına gelir. Hayır, bu mümkün değil. Aksi takdirde, en esnek uygulamaların neyi yapması gerektiğine dair kendi UserDetails uygulamanızı sağlamanız gerekir. –

İlgili konular