Spring Boot OAuth2:如何检索用户令牌信息详细信息



我正在关注 https://spring.io/guides/tutorials/spring-boot-oauth2/,到目前为止一切正常。实际上,我什至设法将Google Oauth作为第二个身份验证提供商。现在,我正在尝试从后端的令牌信息终结点读取信息,以将其与本地数据库同步并调整输出。但我不知何故正在努力检索信息。

本教程会在某个时刻创建此终结点:

@RequestMapping("/user")
public Principal user(Principal principal) {
return principal;
}

调用时,这为我正确显示(成功登录后)

{
"authorities": [...],
"details": {...},
"authenticated": true,
"userAuthentication": {
"authorities": [...],
"details": {
"email": "foo@bar.com",
"name": "Foo Bar",
"id": "12345674890000"
},
"authenticated": true,
"principal": "12345674890000",
"credentials": "N/A",
"name": "12345674890000"
},
"oauth2Request": {},
"clientOnly": false,
"credentials": "",
"principal": "12345674890000",
"name": "12345674890000"
}

因此,不知何故,Spring Boot Security正在获取正确的信息。现在我正在尝试构建一个Interceptor(基本功能正常工作,拦截器在每个请求上被调用)来处理这些信息。我现在正在努力获取例如电子邮件地址。我找到了这个答案,但它指的是旧版本的 spring boot,只是链接到一个新的界面,但我想知道我是否需要它(对于我认为我拥有的简单用例来说,它看起来也非常复杂)。在我的 spring 应用程序中从这个/user端点获取信息的最佳方法是什么,而无需实际调用我自己的端点来检索它?

我唯一设法拿起的是SecurityContextHolder原则 ID 和其他对我没有帮助的东西。我实际上并没有检索例如电子邮件地址。

尝试使用 SecurityContext:

SecurityContextHolder.getContext().getAuthentication().getPrincipal();

它将包含当前登录的真实用户对象

这可能会有所帮助

我假设您知道用户和角色映射。我的 User 类扩展了 UserDetails,所以我需要覆盖下面提到的一些方法

Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();

然后调用SecurityContextHolder.getContext().getAuthentication()有助于返回User对象,如下所示

User user = null;
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null
&& authentication.getPrincipal() != null
&& authentication.getPrincipal() instanceof User) {
user = (User) authentication.getPrincipal();
}

现在在用户对象中,如果映射完美,您将从用户表中获取所有信息。如用户名,电子邮件,名字,姓氏等。

最新更新