2

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

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

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

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

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

相关堆栈问题

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

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

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

4

1 回答 1

2

Ok, I finally managed to map custom scopes per user using TokenEnhancer as follows:

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

With this approach I can get currently logged in user and update scopes based on user permissions.

But still I don't know whether this is good practice or not.

于 2016-06-13T07:24:40.490 回答