spring-boot - Spring OAuth2.0:根据ClientId(授权码授予类型)获取用户角色
问题描述
我为 AuthServer 设置了 spring boot OAuth,它可以使用 spring-security-jwt 为一些资源服务器提供身份验证服务。我的问题是在进行身份验证时我需要加载用户的角色,但特定于 clientId。例如:如果 user1 有角色 ROLE_A、ROLE_B 用于 client1 和 ROLE_C、ROLE_D 用于 client2,那么当用户使用 client1 或 client2 登录时,他能够看到所有四个角色,即。ROLE_A, ROLE_B, ROLE_C, ROLE_D 因为我正在根据用户名获取角色。如果我需要基于客户端的角色,那么我需要 clientId。仅供参考,我正在使用授权代码流进行身份验证。我见过类似的问题,但这是基于密码授予,但我正在尝试授权代码流,该解决方案对我不起作用。密码授予问题链接
下面是我需要 clientId
MyAuthenticationProvider.java的代码
@Override
public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
String userName = ((String) authentication.getPrincipal()).toLowerCase();
String password = (String) authentication.getCredentials();
String clientId = ? // how to get it
....
}
}
MyUserDetailsService.java
@Override
public UserDetails loadUserByUsername(String username) {
String clientId = ? // how to get it
....
}
}
解决方案
您可能需要在 Spring-security 中查看 OAuth2Authentication。当您的客户端通过 oauth2 身份验证时,您的“身份验证”实际上是最终实现身份验证的 OAuth2Authentication 实例。
如果你看到 OAuth2Authentication 的实现,它的完成如下;
public Object getPrincipal() {
return this.userAuthentication == null ? this.storedRequest.getClientId() : this.userAuthentication
.getPrincipal();
}
因此,如果请求包含“clientId”,那么只要您的请求不包含用户身份验证,您就应该能够通过调用 getPrincipal() 并将类型转换为 String 来获取 clientId。
对于您的第二种情况,用户名实际上被视为 clientId。您需要调用内存中、RDBMS 或任何存储了 clientId 并返回 ClientDetails 的实现。通过查看 Spring security 的 ClientDetailsUserDetailsService 类,您将能够有所了解。
推荐阅读
- rspec - 在 FactoryBot 中,创建 HABTM 关联时出现错误:“堆栈级别太深”
- google-chrome - 如何在 .Net 框架 4.0.30319 中设置 HttpCookie Samesite 属性?
- ember.js - ember-api-actions中的memberAction和collectionAction有什么区别
- python-3.x - 我的文字没有显示在新窗口中,可能是什么问题?
- r - 在包 C50 中找不到数据集“流失”
- domain-driven-design - 以一对多关系从聚合更新值对象
- windows - 批量创建包含它们所在文件夹名称和其他数据的文件
- spring-boot - 运行 Spring Boot MockMvc 测试时“找不到返回值的转换器”
- c# - 将一串数字放入数组中
- linux - cpu中的控制寄存器是什么?