Spring Security 如何在spring authorization server中使用grant类型作为refresh_token时从身份验证中获取userInformation

xxe27gdn  于 2023-06-23  发布在  Spring
关注(0)|答案(1)|浏览(176)

我正在使用spring的新授权服务器实现一个自定义授权服务器。我们需要实现一个CustomAccessTokenResponseHandler,用于在http json响应中提供附加信息。我通过实现AuthenticationSuccessHandler并重写onAuthenticationSuccess方法来添加一些额外的用户信息。配置中还使用了自定义身份验证授权类型(身份验证转换器、提供程序和令牌)和TokenCustomizer,以向令牌添加额外的声明。问题是写刷新令牌,即;当提供授权类型作为刷新令牌并请求新的访问令牌时,由于我没有提供用户名和密码,如果我不使用customResponseHandler,令牌仍然会生成,但没有它。现在的问题是身份验证对象包含访问令牌,但在其主体中,我找不到用户详细信息。我无法理解securityContext在从refresh-token创建access-token时是如何获得用户信息的,以及我在哪里可以找到这些细节。我只需要用户名来查询数据库,并获取一些额外的信息,它在响应中提供。

@Transactional
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException {
Auth2AccessTokenAuthenticationToken accessTokenAuthentication =
                (OAuth2AccessTokenAuthenticationToken) authentication;
        OAuth2ClientAuthenticationToken oAuth2ClientAuthenticationToken = (OAuth2ClientAuthenticationToken) accessTokenAuthentication.getPrincipal();
        CustomPasswordUser user = (CustomPasswordUser) oAuth2ClientAuthenticationToken.getDetails();
..................
..........................}```

This piece of code is giving error because oAuth2ClientAuthenticationToken.getDetails() now has the following structure 
OAuth2ClientAuthenticationToken [Principal=eQCLrL7JVHw1GRzP, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[]]. 
SecurityContextHolder.getContext().getAuthentication().getDetails() returns WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null].

P.S : I can get the actual accesstoken from authentication but I am parallely working on creating custom JWTEncoder using JWE, and do not want to decode the token inside authorization server nor does I think it is the right approach.
zphenhs4

zphenhs41#

看看OAuth2AuthorizationService。您可以查询一个OAuth2Authorization,并从传递给您的authentication中的refresh_token获取用户的所有详细信息。

相关问题