我有两个Spring应用程序:身份验证服务和业务服务。
当网络服务用户在身份验证服务进行身份验证时,他会获得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();
如果网络服务用户在身份验证服务进行身份验证并调用业务服务,则detailsMap
将包含authenticate()
中设置的信息。但如果他刷新令牌并再次调用商业服务,则detailsMap
将为null
。
我希望在刷新令牌后保留detailsMap
。我怎样才能做到这一点?
答案 0 :(得分:0)
作为一种解决方法,我们不再使用details
,而是将其数据保存到UserDetails
实施UserDetailsImplementation
中。
在Authentication authenticate(Authentication authentication)
实施的方法AuthenticationProvider
中,我们返回UsernamePasswordAuthenticationToken
,其principal
设置为UserDetailsImplementation
。此UserDetailsImplementation
也会在UserDetailsService
实现中返回,该实现在刷新令牌时调用。
在业务服务中,我们可以通过
访问所需的数据((UserDetailsImplementation) authentication.getPrincipal()).getDesiredData();