Spring,Oauth2:刷新令牌后丢失了身份验证详细信息

时间:2016-03-30 12:46:14

标签: java spring spring-security spring-security-oauth2

我有两个Spring应用程序:身份验证服务业务服务

当网络服务用户在身份验证服务进行身份验证时,他会获得access_tokenrefresh_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();

如果网络服务用户在身份验证服务进行身份验证并调用业务服务,则detailsMap将包含authenticate()中设置的信息。但如果他刷新令牌并再次调用商业服务,则detailsMap将为null

我希望在刷新令牌后保留detailsMap。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

作为一种解决方法,我们不再使用details,而是将其数据保存到UserDetails实施UserDetailsImplementation中。

Authentication authenticate(Authentication authentication)实施的方法AuthenticationProvider中,我们返回UsernamePasswordAuthenticationToken,其principal设置为UserDetailsImplementation。此UserDetailsImplementation也会在UserDetailsService实现中返回,该实现在刷新令牌时调用。

业务服务中,我们可以通过

访问所需的数据
((UserDetailsImplementation) authentication.getPrincipal()).getDesiredData();