Spring Oauth获取当前用户

时间:2018-08-27 15:44:06

标签: java spring oauth oauth-2.0 spring-oauth2

我正在开发一个包含3个较小项目的系统,如下所示:

  • 客户
  • 资源服务器
  • 身份验证服务器

身份验证服务器具有一个注册器和一个登录页面。资源服务器由身份验证服务器保护。

我想从客户端通过REST API访问资源。客户端正在通过Spring中的OAuth2RestTemplate调用资源服务器以访问资源。在对自己进行身份验证之后,我设法访问了该资源。

现在是问题所在。在客户端,我需要知道当前用户以显示用户名并允许用户更改其个人资料。

我尝试使用

通过spring security访问用户的主体
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

,但它刚返回null。 所以我的问题是:是否可以通过OAuth2RestTemplate获取当前登录用户?

编辑:

因此,我决定更改计划以在身份验证服务器中实现链接,该链接返回用户信息。问题是,当我想通过OAuth2RestTemplate与身份验证服务器对话时,身份验证服务器仅返回登录页面。当我从浏览器中调用页面或想通过OAuth2RestTemplate与资源服务器对话时,一切都正常。

2 个答案:

答案 0 :(得分:0)

在成功通过身份验证之后,通过重写类AbstractAuthenticationProcessingFilter的方法将身份验证对象添加到安全上下文持有者

    public void successfulAuthentication(
    HttpServletRequest request,
    HttpServletResponse response,
             FilterChain chain, 
            Authentication authentication) throws IOException, ServletException

                 {
             // Add the authentication to the Security context 
   SecurityContextHolder
.getContext()
.setAuthentication(authentication); 

            }

答案 1 :(得分:0)

为授权服务器中的AuthorizationServerEndpointsConfigurer设置TokenEnhancer。您可以将用户信息添加到令牌中,作为其他信息映射。

这是自定义TokenEnhancer的示例实现,

    public class CustomTokenEnhancer implements TokenEnhancer {

    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {

        final Map<String, Object> additionalInfo = new HashMap<String, Object>();
        UserDetails user = (UserDetails) authentication.getPrincipal();

        additionalInfo.put("<custom_user_info>", user.getUsername());

        ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);

        return accessToken;
    }

}

在您的授权服务器中,

public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.tokenEnhancer(new CustomTokenEnhancer());
    }