你在这里有几个选项(至少..)。
1)。你可以想象用一个规则来处理决定逻辑,其中“角色”被分配给给定的用户 - 而不是将其标记到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)。只需使用auth0访问令牌中提供的auth0用户标识(可将其发送到API),您就可以使用这些知识查找Auth0的“超出带宽”使用的更细粒度的权限(使用您的自己的数据库存储用于在用户Id等等上键入的权限或者在访问令牌上标记的某些其他客户声明 - 或者,例如,如果您将ROLE信息标记为元数据到Auth0用户配置文件,则可以使用auth0然后可以执行Auth0用户配置文件查找(管理api),并以此方式获取详细信息,请参阅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访问令牌结束。例如。
谢谢您的详细信息。 所以说我去选择#2,因为我已经写我的角色Auth0的自定义元数据 - 弹簧安全将如何拒绝访问基于此? – Killyz
嗨,我更新了上面的答案 - 请参阅我关于选项1和选项2的观点。选项1将为您提供现成代码/弹簧引导配置享有的声明式“范围”检查支持。选项2将需要更多的工作 - 您可以将其作为自定义过滤器或控制器本身。 – arcseldon
刚刚添加了一些评论和一个链接到一个旧的Auth0库 - 一个我在2016年写过,因为v1已经取代。 – arcseldon