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

标签 spring oauth oauth-2.0 spring-oauth2

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

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

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

我尝试提供自己的 ClientsDetailService,在其中为每个用户构建 ClientDetails,但我收到的唯一信息是客户端 ID(“网络应用程序”),并且我无法知道哪个用户已登录。

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

相关stack question

问题 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/

相关文章:

java - 通过 Maven 在 Spring Boot 中配置 Activity 配置文件

javascript - 使用 hello.js 无法在 Twitter 上发帖

ios - 与服务器的安全通信 - 解决方案

django - 强制谷歌通过 python 社交身份验证刷新 token

c# - OWIN 中 OAuthAuthorizationServer 的自定义响应

java - 如何自定义 Spring Boot AccessTokenProvider?

java - Spring新事务结合Retryable

java - Spring - 创建 Bean 时出现奇怪的错误

java - Spring :InvalidDataAccessApiUsageException?

java - 如何在不传递用户名和密码的情况下获取 salesforce session ID?