2017-01-13 8 views
0

In unserem Microservice verfügt jeder authentifizierte Spring Security Benutzer über eine anwendungsspezifische Datenstruktur. wenn auf darüber nachzudenken, wie können wir einfach diese Daten zwischenzuspeichern zusammen mit dem Benutzer, dachten wir, es wäre gut, wenn es so weit ähnlich geschehen könnte:Benutzerspezifische Anwendungsdaten mit Spring Security zwischenspeichern

  1. die im Cache gespeicherten Daten an die In-Memory-Authentifizierung hinzufügen wenn die Benutzer zu schaffen:

    public void configureGlobal(AuthenticationManagerBuilder auth) { 
        auth.inMemoryAuthentication().withUser("user").password("123").roles("ROLE"); 
        auth.inMemoryAuthentication().withUser("user").cache(appDate); 
        ... 
    } 
    
  2. die Daten in @RestController Methoden ziehen:

    @RequestMapping("/foo") 
    public void foo() {  
        User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
        Object details = SecurityContextHolder.getContext().getAuthentication().getDetails();  
        Object cachedAppDate= SecurityContextHolder.getContext().getAuthentication().getCachedData();  
    } 
    

Offensichtlich ist die fettgedruckte Methode eine Wunschliste und existiert nicht. Haben Sie Ratschläge, wie Sie dies einfach mit dem vorhandenen Spring Security Framework tun können?

danke!

+0

ich glaube, Sie Cache als Detail auf die Authentifizierung festlegen. – chaoluo

Antwort

0

Wenn Sie Ihre zwischengespeicherten Daten nur mit Benutzername (kein Kennwort erforderlich) abrufen können Sie implementieren org.springframework.security.core.userdetails.UserDetailsService, es hat nur eine Methode - UserDetails loadUserByUsername(String username), und erforderliche Daten als benutzerdefinierte UserDetail-Objekt zurückgeben. Nach der Implementierung der Schnittstelle übergeben Sie sie einfach als UserDetailService für AuthenticationManagerBuilder.

Wenn Sie ein Passwort benötigen, um diese gecachten Daten zu bekommen, werden die Dinge ein bisschen kompliziert. Sie sollten Ihren eigenen AuthenticationProvider erstellen und zwischengespeicherte Daten in Principal oder UserDetails ablegen. Zum Beispiel-Code für setzen zusätzliche Daten in Haupt:

public class MyProvider implements org.springframework.security.authentication.AuthenticationProvider { 

    @Override 
    public boolean supports(Class<? extends Object> authentication) { 
     return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)); 
    } 

    @Override 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
     UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication; 

     ... // check login/password 

     Object cachedAppDate = "i'm cached data!"; 
     MyUser user = new MyUser(token, cachedData); 
     UsernamePasswordAuthenticationToken output = new UsernamePasswordAuthenticationToken(user, authentication.getCredentials(), user.getAuthorities()); 
     output.setDetails(authentication.getDetails()); 
     return output; 
    } 

} 

public static class MyUser extends org.springframework.security.core.userdetails.User { 

     private final Object cachedData; 

     public User(UsernamePasswordAuthenticationToken token, Object cachedData) { 
      super(token.getName(), "", token.getAuthorities()); 
      this.cachedData = cachedData; 
     } 

     public Object getCachedData() { 
      return this.cachedData; 
     } 
    } 

und Zugriff im Cache gespeicherten Daten als ((MyUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getCachedData();