添加 '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
。例如
在我的 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
。例如