Spring Oauth 获取当前用户
Spring Oauth Get Current User
我正在开发一个包含 3 个较小项目的系统,如下所示:
- 一个客户
- 资源服务器
- 认证服务器
认证服务器有一个注册页面和一个登录页面。资源服务器由认证服务器保护。
我想通过 REST 从客户端访问资源 API。客户端正在通过 OAuth2RestTemplate
从 Spring 调用资源服务器以访问资源。在我对自己进行身份验证后,我设法访问了该资源。
现在进入正题。在客户端,我需要知道当前用户以显示用户名并允许用户更改他的个人资料。
我试图通过 spring 安全性与
访问用户主体
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
但它刚刚返回 null
。
所以我的问题是:有没有办法用 OAuth2RestTemplate
获取当前登录的用户?
编辑:
所以我决定改变计划,在我的认证服务器中实施一个link,其中returns用户信息。问题是,当我想通过 OAuth2RestTemplate
身份验证服务器与身份验证服务器通信时,只需 returns 登录页面。当我从浏览器调用页面或当我想通过 OAuth2RestTemplate
与资源服务器对话时,一切正常。
通过覆盖 class 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);
}
在授权服务器中为您的 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());
}
我正在开发一个包含 3 个较小项目的系统,如下所示:
- 一个客户
- 资源服务器
- 认证服务器
认证服务器有一个注册页面和一个登录页面。资源服务器由认证服务器保护。
我想通过 REST 从客户端访问资源 API。客户端正在通过 OAuth2RestTemplate
从 Spring 调用资源服务器以访问资源。在我对自己进行身份验证后,我设法访问了该资源。
现在进入正题。在客户端,我需要知道当前用户以显示用户名并允许用户更改他的个人资料。
我试图通过 spring 安全性与
访问用户主体Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
但它刚刚返回 null
。
所以我的问题是:有没有办法用 OAuth2RestTemplate
获取当前登录的用户?
编辑:
所以我决定改变计划,在我的认证服务器中实施一个link,其中returns用户信息。问题是,当我想通过 OAuth2RestTemplate
身份验证服务器与身份验证服务器通信时,只需 returns 登录页面。当我从浏览器调用页面或当我想通过 OAuth2RestTemplate
与资源服务器对话时,一切正常。
通过覆盖 class 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);
}
在授权服务器中为您的 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());
}