Spring oAuth2 中基于用户的权限/范围

Posted

技术标签:

【中文标题】Spring oAuth2 中基于用户的权限/范围【英文标题】:User based permissions/scopes in Spring oAuth2 【发布时间】:2016-10-11 16:57:45 【问题描述】:

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

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

问题 1 我需要每个用户而不是客户端(网络应用程序、移动设备...)的不同权限(例如范围)

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

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

相关stack question

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

当我删除用户权限时会发生什么? JWT 是否失效? 在这种情况下,oAuth 工作流程是什么? (refresh_token 是否会获得更新的权限或用户必须再次输入凭据?) 由于这似乎是一种不好的做法,是否有更好的解决方案?

问题 3 有没有一种标准的方法可以用 spring oauth2 实现更细粒度的权限逻辑? (想想 100 多种具有方法级别安全性的不同权限)

【问题讨论】:

可能的答案太多,或者对于这种格式来说,好的答案太长了。请添加详细信息以缩小答案范围或隔离可以在几段中回答的问题。 基本上所有 3 个问题都归结为一个。 spring-security-oath2 是否允许每个用户而不是客户端使用不同的范围,这是一个好习惯吗?我有代码示例,但它们不会提供更多有关问题的见解。 【参考方案1】:

好的,我终于设法使用 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;

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

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

【讨论】:

我也有同样的问题。我想知道这是否是好的做法,或者用户范围应该设置在 ClientDetails 服务以外的其他地方

以上是关于Spring oAuth2 中基于用户的权限/范围的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud gateway + oauth2 实现网关统一权限认证

spring security + Oauth2 内部2个子系统认证用户和管理员权限分离

Spring Security Oauth2 组

Spring Security +Oauth2 +Spring boot 动态定义权限

Spring Cloud OAuth2:添加用户权限

spring boot oauth2.0 和 spring security:如何通过 facebook 或 slack 授予用户登录权限(权限)