Kil*_*lyz 3 spring-security auth0
在我的Spring Boot应用程序中,我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!
您在这里有一些选择(至少..)。
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"
Run Code Online (Sandbox Code Playgroud)
2)。只需使用以下事实,即您将Auth0的auth0用户ID从Auth0发送到API,就可以使用该知识-您可以使用此知识来查找使用Auth0“带外”的更细粒度的权限(使用您的自己的数据库存储,用于存储在用户ID等上键入的权限或在访问令牌上标记的其他一些客户声明-或通过使用auth0(例如,如果您将ROLE信息作为元数据标记到Auth0用户个人资料上),然后可以进行Auth0用户个人资料查找(管理api)按用户ID进行操作,并以这种方式获取详细信息(如果您喜欢这种方法,请参见此处的示例,以获取有关从JWT访问令牌中获取userId声明的Java说明)。
3)。看一下Auth0授权扩展,它通过组,角色和权限为用户授权提供支持。您可以在登录过程中定义预期的行为,并且您的配置设置将捕获到在运行时执行的规则中。
这里没有硬性和快速的答案,以上各点都是值得考虑的,以及您的项目需要什么。如果您确实想按照上面的代码利用现有的声明性授权,则选择1,将ROLES信息与挂钩scope是最简单的方法。
但是,我实际上会主张选择2)。对于大多数“务实”的中小型企业而言,我的能力比我高。在这里,您将需要在Controller端点内添加一些程序代码来查找ROLES,然后以这种方式做出安全决策。您还可以将查找代码推送到一个通用的Custom Filter中,该Custom Filter在到达Controller代码之前执行,并以这种方式进行必要的Spring Security操作-更多高级开发人员选项-(我以前编写了支持此功能的库Spring Boot / Security的一种方法-因此可以证明这是一种合理的方法。请参见此处进行演示,但再次确保您更愿意继续构建业务逻辑,而不是绕开构建库,对吗?)。
选项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);
}
Run Code Online (Sandbox Code Playgroud)
这就是您的“ app_metadata”可能的样子:
{
"roles": [
"role1",
"role2"
]
}
Run Code Online (Sandbox Code Playgroud)
您应该最终获得JWT访问令牌,并将其角色添加到中scope。例如。
| 归档时间: |
|
| 查看次数: |
1289 次 |
| 最近记录: |