keycloak - keycloak - 为每个租户/帐户赋予用户不同的权限
问题描述
我们将 Keycloak 用于 SaaS 产品。每个用户都是租户/帐户的一部分,并具有访问此帐户数据的特定角色。角色在 Keycloak 中配置,相关帐户保存为用户的用户属性。
现在我们有了新的要求,让用户可以访问多个帐户。对于这些帐户中的每一个,用户可能具有不同的角色:
User A:
- Account A:
- ADMIN
- Account B:
- Reader
User B
- Account B:
- Reader
...
我发现了很多关于多租户不同方法的文章,但在这个方向上没有任何内容。大多数文章结合了角色和组。但就我而言,我需要为每个帐户创建一个新组。所以我最终会拥有数千或数百万个组。
现在我的 API 可以根据发布的 JWT 授权请求。理想情况下我可以保留这个。
使这种结构(用户可以访问具有不同角色的多个帐户)到位的最佳方法是什么?这实际上可以使用keycloak吗?
还是我想错了方向?这听起来像是一个相当常见的用例。
已经非常感谢了。
解决方案
角色在 Keycloak 中配置,相关帐户保存为 > 用户的用户属性。
我不确定你为什么需要这个,因为你可以根据用户角色推断出来。
现在我们有了新的要求,让用户可以访问多个帐户。对于这些帐户中的每一个,用户可能具有不同的角色:
如果我完全理解您的问题,我认为可以通过客户级别的角色来解决。例如:
去 :
- 你的领域;
- 客户;
- 账户 A;
- 角色;
- 添加角色;
- 设置角色并保存
要将角色设置为用户,请转到
- 你的领域;
- 用户;
- 点击用户;
- 角色映射;
- 从客户角色下拉列表中选择客户(例如,账户 A)
- 添加角色;
现在我的 API 可以根据发布的 JWT 授权请求。理想情况下我可以保留这个。
Account A
代表的令牌请求user a
如下所示:
"acr": "1",
"realm_access": {
"roles": [
"offline_access",
"uma_authorization"
]
},
"resource_access": {
"AccountA": {
"roles": [
"ADMIN"
]
},
"AccountB": {
"roles": [
"Reader"
]
},
"account": {
"roles": [
"manage-account",
"view-profile"
]
}
},
有人可能会说,当从客户端请求令牌时,Account A
并不真正关心客户端中的角色Account B
。这可以通过使用 Keycloak 的 Scope Feature 来解决。使用此功能,您可以从与当前客户端相关的其他客户端中选择角色。默认情况下,包括所有角色。尽管如此,要过滤角色需要:
- 你的领域;
- 客户;
- 在这种情况下,客户账户 A;
- 范围;
- 切换到
OFF
选项Full Scope Allowed
; - 节省。
令牌现在的样子:
"resource_access": {
"AccountA": {
"roles": [
"ADMIN"
]
}
},
推荐阅读
- pandas - 如何将其他列中的连续值分组为基于一列的范围
- c# - 如何正确指定依赖的版本范围..?
- amazon-web-services - AWS DMS - 错误 - “拥有角色的 AWS 账户必须与 API 的调用者匹配”
- javascript - 如何在 React Redux 中渲染日期对象?
- java - Math.random 的变量递减确保非重复性?
- mysql - 选择 while 而不是 While select 导致问题
- postgresql - 为什么 psql 不显示我的数据,即使 pgadmin 有它
- java - 将大量双精度值的数字与三个常数进行比较
- c# - 如何为属性类型的通用参数指定自定义 json 转换器
- node.js - 在 NestJS 中使用 @AuthGuard、Passport 进行社交登录