2013-02-05 23 views
10

Czy istnieje jeszcze możliwość ustawienia obiektu List<GrantedAuthority> w obiekcie Authentication/UserDetailsImpl? W mojej aplikacji mam dwie warstwy zabezpieczeń, jedną do logowania (która używa mojego niestandardowego uwierzytelnienia logowania, w klasie ustawiam obiekt Authentication przy użyciu UsernamePasswordAuthenticationToken) i jedną dla "pytania wymagającego odpowiedzi", w którym użytkownik jest proszony o odpowiedź konkretne pytanie.Spring Security: Set GrantedAuthority

Co chcę zrobić, to dodać GrantedAuthority do aktualnego List<GrantedAuthority>, który został utworzony podczas procesu logowania, po tym jak użytkownik odpowie na pytanie o wyzwanie.

Czy to możliwe?

+0

Jedno wyjaśnienie w tej sprawie jest to, co klasa realizacja UserDetails jest. Spring nie zapewnia żadnej klasy o nazwie UserDetailsImpl. JdbcDaoImpl tworzy instancję klasy User, podczas gdy wersja LDAP tworzy instancję LdapUserDetailsImpl. Tak naprawdę zależy to w dużym stopniu od tego, jaki typ obiektu otrzymujesz, czy możesz zmienić władze. Nigdy tak naprawdę nie użyłem jednej z implementacji UserDetails dostarczanej przez Spring właśnie ze względu na takie rzeczy jak niezmienne zestawy dla autoryzowanych autorytetów, co jest czymś, co można zmienić. –

Odpowiedz

8

można zrobić to z następującego kodu:

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

Metoda UserDetails.getAuthorities() po prostu zwraca obiekt Collection<GrantedAuthority>. Możesz użyć odpowiedniej metody Collection, aby dodać nowe uprawnienia do tej kolekcji.

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
if (principal instanceof UserDetails) { 
    ((UserDetails) principal).getAuthorities().add(New GrantedAuthorityImpl("ROLE_FOO")); 
} 

Selah.

+1

Nie można dodać do kolekcji -> UnmodifiableCollection – Slavak

+0

@Slavak To naprawdę zależy od implementacji używanej w UserDetails. W naszej implementacji nie używamy klasy User z org.springframework.security.core.userdetails. Oczywiście, jeśli musisz ustawić lub zmodyfikować uprawnienia, użycie implementacji, w której kolekcja jest niezmienna i nie ma metody setAuthorities() (która nie jest obiecana w interfejsie UserDetails) oznaczałoby, że odpowiedź na pytanie brzmi po prostu nie. Nie, to niemożliwe. W przeciwnym razie musisz podać własną implementację UserDetails, co i tak jest najbardziej elastyczne. –

Powiązane problemy