问题描述
(这可以链接到 Get keycloak users based on their effective roles)
我的问题:Keycloak JavaScript API 只返回用户定义的角色和属性,而不是从用户组继承的有效角色和属性。
这是我的理解,如果我错了,请纠正我......
Keycloak 提议组。它们是管理用户的一种方式。它们尤其能够通过简单地将用户拉入和拉出组来分解设置用户的角色和属性。
注意:我知道组不是 OAuth 规范的一部分。实际上,称为“内置”“组”的 Keycloak JWT 映射器不映射组,而是将领域角色映射到称为组的参数。我的信念是,尽管组非常适合 Keycloak 配置,但 JWT 不应包含组,而应包含属性和角色。
Keycloak API 应提供对用户(用户定义)及其组(在 Keycloak 中称为“有效”角色或属性)赋予的承诺角色和属性的访问权限。
然而,我的经验是 Keycloak API 实际上提供对用户定义的属性和角色的访问,而不是从组继承的那些。
我通过编写一些简单的 JavaScript 策略对此进行了测试:
- 我将用户与每个资源相关联(通过使用资源属性)
- 我的政策通过将请求用户与资源的关联用户进行比较来授予访问权限(将其视为简化的 UMA)
- 当用户相同时,一个策略授予访问权限,另一个授予同一组中的用户,另一个授予具有相同属性的用户,另一个授予具有相同角色的用户。
这适用于用户定义的属性和角色,甚至适用于组。但是一旦我使用组为我的用户设置角色或属性,它就会崩溃。
请注意,在获取与资源相关的用户的角色或属性时,它会崩溃。请求用户工作正常,因为它的参数来自其 JWT,并且映射器实际上考虑了所有继承。
更准确地说,这个方法 isUserInRealmRole 是一个完美的例子:
与它所说的相反,它实际上并没有返回用户是否处于领域角色。如果在用户级别授予用户角色,则返回 true。如果角色继承自组,则返回 false。
我尝试了多种获取此信息的方法,但无论如何尝试,问题仍然存在。我在 JavaScript 中没有找到任何方法来获取继承的属性或角色(也许我错过了?)。
我的恐惧...
四处寻找线索,我发现这个 Keycloak 问题似乎表明存在性能问题:KEYCLOAK-11494 Get users for role composite by Cracky5457 · Pull Request #6326 · keycloak/keycloak · GitHub。这表明遍历所有组和复合角色可能是一场表演噩梦,因此故意不这样做。
这对于角色来说比属性更麻烦,因为虽然可以使用 UI 在组和用户级别设置相同的属性,但对于角色来说这是不可能的:一旦在组级别设置了角色,对用户显示为灰色……因为它已经设置了!
要纠正路线,需要在组中搜索角色和属性。不幸的是,这意味着应该递归搜索组(顺便说一下,角色也是如此,因为它们可以组合)。
这可能是一个大问题:我们可以有一个有效的产品,有用户角色;后来有人使用组来设置角色,但它中断了。当通过搜索组发现并缓解该错误时,他们通常会忽略组层次结构,当有人使用它时,产品又会崩溃。这意味着潜在的错误,这是非常危险的。 换句话说,拿一个工作的系统,用UI设置一个组来设置一个角色,UI显示角色中的用户,然后系统崩溃。
所以,问题:
- 这种行为是故意的,还是一个错误?
- 如果是故意的,我建议应该更改某些内容,因为文档没有得到尊重。
- 如果是故意的,应该相应地更改方法名称,并应该提出获得有效属性和角色的方法。
恐怕目前我对任何使用 Keycloak API 的人(例如编写 JavaScript 策略)的建议是完全避免组。 这很遗憾,因为群组是管理用户的绝佳工具。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)