在我目前的设置中,我有独立的spring oAuth2服务器,独立资源服务器和带反向代理的angularJs应用程序。
在身份验证服务器端,我注册了2个客户端(用于服务通信的Web应用程序和内部客户端)。我正确地接收了客户端范围和用户角色。
问题1 我需要每个用户而不是客户端(web-app,mobile,...)
的不同权限(例如范围)我尝试提供自己的ClientsDetailService,我会为每个用户构建ClientDetails,但我收到的只是客户端ID(“web-app”),我无法知道哪个用户已登录。
有没有办法注入用户上下文?
问题2 如果我将所有可用权限放在JWT中并在资源服务器上执行“hasPermission(...)”逻辑,我可以以某种方式解决这个问题。基本上,客户端应用程序在N范围和服务器中工作,基于用户角色构建权限列表并创建JWT。但...
问题3 有没有一种标准方法可以使用spring oauth2实现更精细的权限逻辑? (考虑方法级安全性的100多个不同权限)
答案 0 :(得分:2)
好的,我终于设法使用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;
}}
通过这种方法,我可以根据用户权限获取当前登录用户和更新范围。
但我仍然不知道这是否是好的做法。