2016-03-30 5 views
2

У меня есть два приложения Spring: a Служба аутентификации и Бизнес-сервис.Spring, Oauth2: данные аутентификации потеряны после обновления токена

Когда пользователь вебсервис аутентификацию на Authentication Service, он получает access_token и refresh_token. Он может обновить свой access_token, отправив refresh_token на услугу. Сервис реализует AuthenticationProvider, там детали аутентификации устанавливаются:

@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; 
} 

Бизнес Сервис обеспечивается Oauth2. Ее контроллер содержит

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

Если пользователь вебсервис аутентификацию на Authentication Service и называет Business Service, detailsMap будет содержать информацию, указанную в authenticate(). Но если он обновит токен и снова вызовет Business Service, detailsMap будет null.

Я хочу, чтобы detailsMap был сохранен после того, как токен был обновлен. Как я могу это достичь?

ответ

0

В качестве обходного пути мы больше не используем details, но сохраняем их данные в реализации UserDetailsUserDetailsImplementation.

В методе Authentication authenticate(Authentication authentication) в AuthenticationProvider реализации мы возвращаем UsernamePasswordAuthenticationToken которого principal установлен в UserDetailsImplementation. Этот UserDetailsImplementation также возвращается в реализацию UserDetailsService, которая вызывается при обновлении токена.

В Business Service мы можем получить доступ к требуемой информации по

((UserDetailsImplementation) authentication.getPrincipal()).getDesiredData();