在我当前的设置中,我有独立的 spring oAuth2 服务器、独立的资源服务器和带有反向代理的 angularJs 应用程序。
在身份验证服务器端,我注册了 2 个客户端(Web 应用程序和用于服务通信的内部客户端)。我正确接收客户端范围和用户角色。
问题 1 我需要每个用户而不是客户端(网络应用程序、移动设备等)的不同权限(例如范围)
我尝试提供自己的 ClientsDetailService,在其中为每个用户构建 ClientDetails,但我收到的唯一信息是客户端 ID(“网络应用程序”),并且我无法知道哪个用户已登录。
有没有办法注入(inject)用户上下文?
问题 2 如果我将所有可用权限放入 JWT 中并在资源服务器上执行“hasPermission(...)”逻辑,我可以以某种方式解决此问题。基本上,客户端应用程序在 N 个范围内工作,服务器基于用户角色构建权限列表并创建 JWT。但是...
- 当我删除用户权限时会发生什么? JWT 是否已失效?
- 此场景中的 oAuth 工作流程是什么? (refresh_token 会获得更新的权限还是用户必须再次输入凭据?)
- 由于这似乎是不好的做法,是否有更好的解决方案?
问题3是否有一种标准方法可以使用 spring oauth2 实现更细粒度的权限逻辑? (想想具有方法级安全性的 100 多种不同权限)
最佳答案
好吧,我终于成功地使用 TokenEnhancer 映射每个用户的自定义范围,如下所示:
public class AuthorityTokenEnhancer implements TokenEnhancer {
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
User user = (User) authentication.getPrincipal();
final ImmutableMap<String, Object> additionalInfo = ImmutableMap.<String, Object>builder()
.put("authorities", user.getAuthorities())
.build();
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
((DefaultOAuth2AccessToken) accessToken).setScope(user.getPermissions());
return accessToken;
}}
通过这种方法,我可以获得当前登录的用户并根据用户权限更新范围。
但我仍然不知道这是否是一个好的做法。
关于spring - Spring oAuth2 中基于用户的权限/范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37753070/