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`对象中获取你需要的属性。
- 粉丝: 254
- 资源: 1940
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 自卸车焊接变形的控制和矫正.pdf
- 组对工装在带传感器油缸焊接中的应用.pdf
- 组合式不锈钢水箱焊接处腐蚀漏水的处理方法.pdf
- 钻机平台及轨道梁H型钢焊接变形控制.pdf
- 钻井平台用桩腿的焊接工艺.pdf
- AI工具助力高效旅行视频制作
- AI助力打造专业旅行视频:从创意到后期的全过程
- 机器学习领域中的逻辑回归:原理、Python实现与垃圾邮件分类应用
- java实现的冒泡排序 含代码说明和示例.docx
- 人、垃圾、非垃圾检测18-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 使用Docker容器化AI项目的入门指南
- Python实现线性回归及其在房价预测中的应用
- 资料阅读器(先下载解压) 5.0.zip
- 知识图谱技术在数据科学与AI领域的应用及其构建方法
- java实现的堆排序 含代码说明和示例.docx
- GEMM优化代码实现1