添加 'ROLE' 到 spring 安全/Auth0 授权

Add 'ROLE' to spring security / Auth0 authorization

在我的 Spring 引导应用程序中,我正在使用 Auth0 来管理对我的其余部分的访问 api。
除了 Auth0 的 scope 之外,我想为每个用户添加一个角色,这反过来将提供额外的访问控制层,其中低权限用户无法访问特定的 API。

我一直在阅读有关自定义规则和授权扩展的内容,但不太明白什么是适合我的实施方式。

这是我的 WebSecurityConfigurerAdapter 代码片段:
所以基本上我只想要 'ADMIN' 例如能够访问 /test/**

@Override
    protected void configure(HttpSecurity http) throws Exception {
        JwtWebSecurityConfigurer
                .forRS256(configBean.getAuth0ApiAudience(), configBean.getAuth0Issuer())
                .configure(http)
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/test/**").hasAuthority("read:test")
                .anyRequest().authenticated();
    }

如有任何帮助,我们将不胜感激!

你在这里有几个选择(至少..)。

1).您可以想象使用规则来处理将 "ROLES" 分配给给定用户的决策逻辑 - 而不是将其标记到 scope(您也可以这样做......),您可以决定他们属于该访问令牌的 custom claim。规则正文可能包含类似

的内容
// lookup the permissions for given user somehow (secured webhook, static map etc) - here lets imagine we want ROLE_USER assigned

context.accessToken.scope = "ROLE_USER" 
 // or
context.accessToken['https://mydomain/roles'] = "ROLE_USER"

2).只需使用您在发送到 API 的 Auth0 的 JWT 访问令牌中拥有可用的 auth0 用户标识这一事实 - 您可以使用此知识来查找使用 "out of bands" 的更细粒度的权限Auth0(使用您自己的数据库存储来获取在用户 ID 等上键入的权限或在访问令牌上标记的其他一些客户声明 - 或者如果您将 ROLE 信息作为元数据标记到 Auth0 用户配置文件中,则使用 auth0。然后您可以执行Auth0 用户配置文件查找(管理 api)通过用户 ID 并以这种方式获取详细信息。如果您喜欢,请参阅 example here 中关于从 JWT 访问令牌获取 userId 声明的说明 Java方法。

3).查看 Auth0 authorization extension,它通过组、角色和权限提供对用户授权的支持。您可以在登录过程中定义预期的行为,您的配置设置将被捕获在运行时执行的规则中。

这里没有硬性答案,以上每个都值得考虑,以及您的项目需要什么。如果您真的想按照上面的代码利用现有的声明性授权,那么选项 1 并将 ROLES 信息与 scope 挂钩是最简单的方法。

但是,我实际上会提倡选项 2)。高于我自己,对于大多数 "pragmatic" 中小型企业。在这里,您需要在 Controller 端点内使用一些编程代码来查找 ROLES,然后以这种方式做出安全决策。您还可以将查找代码推送到一个通用的自定义过滤器中,该过滤器在到达控制器代码之前执行,并以这种方式进行必要的 Spring 安全操作——更多的是高级开发人员选项——(我已经在过去支持 Spring 启动/安全的这种方法 - 因此可以保证这是一种合理的方法。参见 here for demonstration 但同样,确保您更愿意继续构建业务逻辑而不是绕道建立一个图书馆,对吧​​?)。

选项 3)。如果您正在构建一个严肃的企业应用程序并且需要所有集成,那么绝对值得探索 - 特别是在与企业连接(如 Active Directory)的集成正在发挥作用的情况下。

如果您仍然感到困惑,请给我留言,但希望以上内容提供了足够的见解以供进一步探索。

更新快

在我们的讨论之后,这里有一条小规则可以让您了解您所询问的想法:

function addRoleScopesToAccessToken(user, context, callback) {
  console.log("add-role-scopes-to-access-token rule");
  user.app_metadata = user.app_metadata || {};
  var roles = user.app_metadata.roles;
  if (roles && roles.length > 0) {
    context.accessToken.scope = roles.join(' ');
  }
  callback(null, user, context);
}

这就是您的 "app_metadata" 的样子:

{
  "roles": [
    "role1",
    "role2"
  ]
}

您最终应该得到一个 JWT 访问令牌,其中的角色已添加到 scope。例如