我正在关注https://spring.io/guides/tutorials/spring-boot-oauth2/,到目前为止一切正常。实际上,我甚至设法将Google Oauth作为第二个Auth提供商。现在,我正在尝试从后端的令牌信息端点读出信息,以将其与我的本地数据库同步并调整输出。但我在某种程度上努力检索信息。
教程在某个时刻创建了这个端点:
@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"
}
因此,弹簧启动安全性正在获取正确的信息。现在我正在尝试构建一个Interceptor
(基本功能正在工作,每个请求都会调用拦截器)来处理这些信息。我很难得到例如现在是电子邮件地址。我发现了this的答案,但它指的是旧版本的弹簧启动,只是链接到一个新的界面,但我想知道我是否需要它(对于简单的用例,它看起来也很复杂我认为我有)。在我的spring应用程序中从/user
端点获取信息而不实际调用我自己的端点来检索它的最佳方法是什么?
我唯一能够接受的是通过SecurityContextHolder
原则ID以及其他对我没有帮助的东西。我实际上没有找到例如电子邮件地址。
答案 0 :(得分:0)
这可能有帮助
我假设您知道用户和角色映射。我的User类扩展了UserDetails,因此我需要重写下面提到的一些方法
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
然后调用SecurityContextHolder.getContext()。getAuthentication()有助于如下返回用户对象
User user = null;
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null
&& authentication.getPrincipal() != null
&& authentication.getPrincipal() instanceof User) {
user = (User) authentication.getPrincipal();
}
如果映射完美,现在在用户对象中,您将从用户表中获取所有信息。例如用户名,电子邮件,名字,姓氏等。