2013-02-05 17 views
10

Gibt es trotzdem die List<GrantedAuthority> im Authentication/UserDetailsImpl-Objekt zu setzen? In meiner Anwendung habe ich zwei Sicherheitsebenen, eine für die Anmeldung (die meinen benutzerdefinierten Anmeldeauthentifikator verwendet, in der Klasse habe ich Authentication Objekt mit der UsernamePasswordAuthenticationToken) und eine für eine "Abfrage", wo der Benutzer aufgefordert wird, zu beantworten eine bestimmte Frage.Spring Security: Set GratedAuthorities

Was ich tun möchte, ist eine GrantedAuthority zu der aktuellen List<GrantedAuthority>, die während des Login-Prozesses erstellt wurde, nachdem der Benutzer die Abfrage Frage beantwortet.

Ist das möglich?

+0

Eine Sache, auf das zu klären ist, welche Klasse der Implementierung Userdetails. Spring stellt keine Klasse namens UserDetailsImpl bereit. Der JdbcDaoImpl erstellt eine Instanz der Benutzerklasse, während die LDAP-Version eine Instanz von LdapUserDetailsImpl erstellt. Es hängt also sehr stark davon ab, welchen Objekttyp Sie zurückbekommen, ob Sie die Berechtigungen ändern können. Ich habe nie eine der von Spring bereitgestellten UserDetails-Implementierungen verwendet, und zwar aufgrund von Dingen wie unveränderlichen Sets für Autoritäten, die sich ändern können. –

Antwort

8

Sie können es mit folgendem Code tun:

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

Die UserDetails.getAuthorities() Methode gibt nur ein Collection<GrantedAuthority> Objekt zurück. Sie können die entsprechende Collection-Methode verwenden, um Ihrer Sammlung die neue Berechtigung hinzuzufügen.

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

Selah.

+1

Kann nicht zur Sammlung hinzugefügt werden -> UnmodifiableCollection – Slavak

+0

@Slavak Das würde wirklich davon abhängen, welche Implementierung Sie für UserDetails verwenden. Wir verwenden in unserer Implementierung nicht die Benutzerklasse von org.springframework.security.core.userdetails. Wenn Sie die Berechtigungen festlegen oder ändern müssen, indem Sie eine Implementierung verwenden, bei der die Auflistung unveränderlich ist und es keine Methode setAuthorities() gibt (was auf der Benutzeroberfläche UserDetails nicht versprochen wird), würde die Antwort auf die Frage einfach nein lauten. Nein, das ist nicht möglich. Andernfalls müssen Sie eine eigene Implementierung von UserDetails bereitstellen, was die meisten flexiblen Apps ohnehin tun müssen. –