Spring oAuth2

时间:2016-06-10 16:28:24

标签: spring oauth oauth-2.0 spring-oauth2

在我目前的设置中,我有独立的spring oAuth2服务器,独立资源服务器和带反向代理的angularJs应用程序。

在身份验证服务器端,我注册了2个客户端(用于服务通信的Web应用程序和内部客户端)。我正确地接收了客户端范围和用户角色。

问题1 我需要每个用户而不是客户端(web-app,mobile,...)

的不同权限(例如范围)

我尝试提供自己的ClientsDetailService,我会为每个用户构建ClientDetails,但我收到的只是客户端ID(“web-app”),我无法知道哪个用户已登录。

有没有办法注入用户上下文?

相关stack question

问题2 如果我将所有可用权限放在JWT中并在资源服务器上执行“hasPermission(...)”逻辑,我可以以某种方式解决这个问题。基本上,客户端应用程序在N范围和服务器中工作,基于用户角色构建权限列表并创建JWT。但...

  • 删除用户权限后会发生什么? JWT是否无效?
  • 此方案中的oAuth工作流程是什么? (refresh_token会获得更新权限还是用户必须再次输入凭据?)
  • 由于这似乎是不好的做法,是否有更好的解决方案?

问题3 有没有一种标准方法可以使用spring oauth2实现更精细的权限逻辑? (考虑方法级安全性的100多个不同权限)

1 个答案:

答案 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;
}}

通过这种方法,我可以根据用户权限获取当前登录用户和更新范围。

但我仍然不知道这是否是好的做法。