2016-06-03 8 views
1

Ich habe einen Frühling Boot-Anwendung, die eine spezielle Anforderung hat, wodurch Benutzer (UserDetails impls) Rollen/Berechtigungen haben müssen, die im laufenden Betrieb ändern, nachdem sie authentifiziert hat.So aktualisieren Sie Spring Security UserDetails impls nach erfolgreicher Anmeldung?

Does Spring Security ermöglichen diese, oder muss ich meine eigene Rolle/Berechtigungssystem unabhängig von Frühling verwenden?

Mein Verständnis mit Spring Security ist, dass die UserDetails impl geladen wird einmal (erfolgreich) Anmeldung und wird nie danach aktualisiert. Aber es muss möglich sein, den Benutzer/Principal im laufenden Betrieb zu aktualisieren, wie sonst würden Benutzer ihren Benutzernamen oder ihr Passwort bearbeiten, wenn sie angemeldet sind? Also nehme ich an, dass, wenn Benutzername/Passwort im laufenden Betrieb geändert werden kann, auch Rollen und erteilte Berechtigungen (Berechtigungen).

Aber für das Leben von mir kann ich nicht ein Beispiel für diese überall online, noch irgendwelche Javadocs finden, die erklären, wie dies zu tun. Würde das Benutzer-Caching auch hier in irgendeiner Weise beteiligt sein (das heißt, Spring Security-Cache-Benutzer, und müsste dieser Cache ebenfalls aktualisiert werden)?

Mein bester Versuch würde etwas so aussehen:

// My UserDetailsService impl: 
public class MyUserDetailsService implements UserDetailsService { 
    @Resource 
    private UserCache userCache; 

    // Lots of stuff up here 

    public void updateUserOnTheFly(UserUpdates userUpdates) { 
     MyUser user = (MyUser)SecurityContextHolder.getContext() 
      .getAuthentication().getPrincipal(); 
     MyUserUpdater updater = new MyUserUpdater(); 

     // Set new roles/permissions here, as well as (perhaps) other 
     // things. 
     updater.update(user, userUpdates); // I believe this updates the 
         // SecurityContext's Authentication instance 

     userCache.removeUserFromCache(user); // Necessary to first remove? 
     userCache.putUserInCache(user); 
    } 
} 

Bin ich auf dem richtigen Weg oder Weg von hier Basis?

Antwort

2

Normalerweise aktualisieren Sie nicht die Rollen nach dem Login. Sie weisen bestimmte Rollen bei der Registrierung zu. Für zB:

  • Nicht in (Unauthorized) unterzeichnet
  • in (ROLE_USER) Signed
  • Einige spezifische in Benutzer unterzeichnet, die u manuell auf einem gewissen Logik zuweisen oder auf der Basis (ROLE_ADMIN) ...

Sobald der Benutzer sich erfolgreich angemeldet hat, können Sie die Anmeldeinformationen von der UserDetails-Schnittstelle lesen.

Aber es kann getan werden. Ihre Benutzer sollten Userdetails Schnittstelle

public class MyUser implements UserDetails { ... } 

implementieren Und dann, wenn Sie den Benutzer aus der Datenbank erhalten, basierend auf Anmeldeinformationen können Sie die Rollen/Behörden aktualisieren und das Objekt wieder zurück.

public class MyUserDetailsService implements UserDetailsService { 
@Override 
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    MyUser mu = customUserRepository.findByUsername(username); 

    List<Authority> authorityList = (List<Authority>) mu.getAuthorities(); 
    authorityList.add(new Authority("ROLE_ON_THE_FLY")); 

    mu.setAuthorities(authorityList); 
    return mu; 
} 
class Authority implements GrantedAuthority { 

    private final String authority; 

    public Authority(String authority) { 
     this.authority = authority; 
    } 

    @Override 
    public String getAuthority() { 
     return authority; 
    } 
} 
} 

Ich hoffe, es hilft.

+0

Danke für die Hilfe Patrik! – smeeb

Verwandte Themen