添加'角色'弹簧安全/ Auth0授权

时间:2017-10-10 05:02:24

标签: spring-security auth0

在我的Spring Boot应用程序中,我正在使用Auth0管理对其余api的访问。
除了Auth0的scope之外,我想为每个用户添加一个ROLE,这反过来将提供一个额外的访问控制层,使特定的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 个答案:

答案 0 :(得分:4)

这里有几个选项(至少......)。

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用户ID这一事实 - 您可以使用此知识查找Auth0“带外”使用的更精细的权限(使用您的自己的数据库存储,用于在用户ID等上键入的权限或在访问令牌上标记的其他客户声明 - 或者如果您将ROLE信息标记为Auth0用户配置文件中的元数据,则使用auth0。然后,您可以执行Auth0用户配置文件查找(管理api)用户ID并以这种方式获取详细信息。如果您喜欢这种方法,请参阅example here以获取Java中关于从JWT访问令牌获取userId声明的说明。

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

这里没有硬性和快速的答案,上述各项优点,以及您对项目的需求。如果您真的想根据上面的代码利用现有的声明性授权,那么选项1和将ROLES信息挂钩到scope是最简单的方法。

但是,我实际上主张选项2)。对我来说,对于大多数“务实”的中小型企业来说。在这里,您需要在Controller端点内部使用一些编程代码来查找ROLES,然后以这种方式做出安全决策。您还可以将查找代码推送到在到达Controller代码之前执行的公共自定义过滤器,并以这种方式执行必要的Spring Security操作 - 更多的是高级开发人员选项 - (我在过去编写了支持此功能的库Spring Boot / Security的方法 - 因此可以保证它是一种合理的方法。请参阅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"
  ]
}

您最终应该使用添加到scope的角色的JWT访问令牌。例如

enter image description here