spring oauth2获取当前登录用户信息.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
使用spring oauth2框架做授权鉴定。想获取当前用户信息怎么办? 我们知道spring oauth2是基于spring security的实现的。 spring security可以通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到当前用户信息。 而spring oauth2通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()却只能拿到当前用户的用户名。 然而实际开发过程中,我们较常用到的大部分都是用户的id。 那么怎么通过配置获取当前用户的信息呢? 在Spring OAuth2框架中,获取当前登录用户信息的过程与Spring Security有所不同。通常,Spring Security允许我们通过`SecurityContextHolder.getContext().getAuthentication().getPrincipal()`来获取详细的用户信息,但当你尝试在OAuth2环境中使用同样的方法时,你可能只会得到当前用户的用户名,而不是完整的用户对象。这是因为OAuth2的设计更侧重于授权,而不是提供详细的用户信息。 为了获取更多的用户信息,例如用户ID,我们需要深入理解Spring OAuth2的工作原理。问题的关键在于`DefaultUserAuthenticationConverter`类。在`extractAuthentication`方法中,如果`userDetailsService`为非空,它会使用`loadUserByUsername`方法从`UserDetailsService`加载用户信息,否则就只返回用户名。这意味着默认情况下,如果你没有自定义`userDetailsService`,OAuth2只会提供用户名。 要解决这个问题,我们需要自定义`UserAuthenticationConverter`,并将它设置到`DefaultAccessTokenConverter`中。`DefaultAccessTokenConverter`有一个`setUserTokenConverter`方法,允许我们传入自定义的`UserAuthenticationConverter`。这样,当转换访问令牌时,我们可以确保包含完整的用户信息。 下面是如何在Spring配置中实现这个过程: ```java @Configuration @EnableAuthorizationServer public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { @Autowired private UserDetailsService customUserDetailsService; @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter())); endpoints.tokenStore(tokenStore()) .tokenEnhancer(tokenEnhancerChain) .authenticationManager(authenticationManager) .userDetailsService(customUserDetailsService); } // 创建自定义的UserAuthenticationConverter private UserAuthenticationConverter customUserTokenConverter() { return new UserAuthenticationConverter() { @Override public Authentication extractAuthentication(Map<String, ?> map) { String username = (String) map.get("sub"); UserDetails userDetails = customUserDetailsService.loadUserByUsername(username); return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); } }; } // 将自定义的UserAuthenticationConverter设置到DefaultAccessTokenConverter中 private AccessTokenConverter accessTokenConverter() { DefaultAccessTokenConverter defaultConverter = new DefaultAccessTokenConverter(); defaultConverter.setUserTokenConverter(customUserTokenConverter()); return defaultConverter; } // 其他配置... } ``` 在这个配置中,我们首先注入了自定义的`UserDetailsService`,然后创建了一个新的`UserAuthenticationConverter`实现,用于从访问令牌映射中提取出完整的用户信息。接着,我们创建了一个`accessTokenConverter`方法,用于设置自定义的`UserTokenConverter`。在`configure`方法中,我们将这些自定义组件应用到了`AuthorizationServerEndpointsConfigurer`。 现在,当你再次调用`SecurityContextHolder.getContext().getAuthentication().getPrincipal()`时,你应该能够获取到包含用户ID和其他必要信息的完整用户对象,而不仅仅是用户名。这使得在实际开发中处理用户信息变得更加方便。记得根据你的具体需求调整`customUserTokenConverter`中的逻辑,以确保它能正确地从`UserDetails`对象中获取你需要的属性。
- 粉丝: 251
- 资源: 1940
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助