2016-03-30 7 views
2

erfrischenden habe ich zwei Frühling Anwendungen: einen Authentication Service und Business Service.Spring, OAuth2: Authentifizierungsdetails verloren, nachdem das Token

Wenn ein Webservice Benutzer im Dienst Authentifizierung authentifiziert, bekommt er ein access_token und ein refresh_token. Er kann seine access_token aktualisieren, indem er die refresh_token an den Dienst sendet. Der Dienst implementiert AuthenticationProvider, da die Einzelheiten der Authentifizierung festgelegt werden:

@Override 
public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
    UsernamePasswordAuthenticationToken newAuthentication = ...; 
    LinkedHashMap<String, Object> detailsMap = (LinkedHashMap<String, Object>) authentication.getDetails(); 
    detailsMap.put(...); 
    newAuthentication.setDetails(detailsMap); 
    return newAuthentication; 
} 

Der Business Service wird gesichert durch Oauth2. Sein Controller enthält

@Secured({ SOME_ROLE }) 
@RequestMapping(...) 
public ResponseEntity<?> doSomething(OAuth2Authentication authentication) { 
    LinkedHashMap<String, String> detailsMap = (LinkedHashMap<String, String>) authentication 
      .getUserAuthentication().getDetails(); 

Wenn der Webservice Benutzer am Authentifizierungsdienst authentifiziert und ruft die Business Service wird detailsMap die in authenticate() Satzinformationen enthalten. Aber wenn er das Token aktualisiert und den Business Service erneut aufruft, wird detailsMapnull sein.

Ich möchte die detailsMap beibehalten werden, nachdem das Token aktualisiert wurde. Wie kann ich das erreichen?

Antwort

0

Als Workaround verwenden wir nicht mehr die details, sondern speichern ihre Daten in der UserDetails Implementierung UserDetailsImplementation.

Bei dem Verfahren Authentication authenticate(Authentication authentication) der AuthenticationProvider Implementierung kehren wir eine UsernamePasswordAuthenticationToken deren principal ist auf UserDetailsImplementation. Diese UserDetailsImplementation wird auch in der UserDetailsService Implementierung zurückgegeben, die bei der Aktualisierung des Tokens aufgerufen wird.

Im Business Service wir die gewünschten Daten von

zugreifen können
((UserDetailsImplementation) authentication.getPrincipal()).getDesiredData(); 
Verwandte Themen