我有一个场景,我想在 keycloak 中限制用户
我有用户
用户可以访问多个帐户 在多个帐户中,使用可以是管理员或代理(读者)
user
|
|
|-------account-1
| |
| |-------admin
|-------account-2
| |
| |-------agent
我们如何在 Keycloak 中将其映射到策略、权限和角色?
任何参考文档任何例子都非常有帮助
也基于:Resources, scopes, permissions and policies in keycloak
根据 Andy 的回答,我创建了一个资源帐户和角色管理员和代理。
创建与示例相同的策略。
我期待将范围(身份验证范围)和角色添加到 JWT 令牌如何映射该部分,以便 API 网关或服务可以进一步验证。
答案 0 :(得分:2)
@changa,我根据我们的讨论重写了我的答案。希望这会有所帮助!
在我回答之前,让我先澄清一些关键领域。我对您链接的 answer 的主要关注点实际上是关于如何使用 Evaluate
工具,我并没有真正深入研究某些概念 - 所以让我们这样做:)
在 Keycloak 中,您会遇到客户端和授权范围。有关这些术语的正式定义,请查看服务器管理指南中的 Core Concepts and Terms,但简单地说:
客户端范围是在通过 scope
参数请求客户端时授予给客户端的范围(一旦资源所有者允许)。请注意,还有 Default Client Scope
的概念,但我选择保持简单。此外,您可以利用协议和角色范围映射器来定制访问令牌中存在的声明和断言。
授权范围另一方面,在针对受保护资源成功评估策略后,授予给客户端。这些范围不会根据用户同意授予客户端。
两者之间的主要区别实际上是客户端获取这些范围的时间和方式。为了帮助您形象化所有这些,这里有一个场景:
一位名叫 Bob
的著名武术家通过 Keycloak 进行身份验证
Bob
会看到一个同意屏幕,要求他分享自己的姓名、战斗风格和年龄。
Bob
选择公开自己的姓名和战斗风格,但拒绝透露自己的年龄。
当我们现在检查令牌时,我们会看到访问令牌的 scope
属性的以下(完全构成的)条目:name
和 fighting_style
。< /p>
此外,假设我们已经设置了几个协议映射器(例如用户属性映射器类型 - 有很多)以通过以下令牌声明显示全名和战斗风格的值:{ {1}} 和 fighter_name
当访问令牌中存在上述两个 martial_arts
时。除了前面提到的两个范围之外,我们还会在检查访问令牌时看到类似 Client Scopes
和 fighter_name: Robert Richards
的内容。
此外,假设 martial_arts: Freestyle Karate
映射到名为 Bob
的领域角色和 Contestant
的客户端角色,并且我们确实在 Keycloak 中设置了任何限制分享这些信息。因此,除了上面提到的所有内容之外,我们还会在令牌中看到这些信息。
Fighter
不喜欢锦标赛支架的布局,因为他渴望尽快与世界冠军争夺战,因此他尝试通过发送针对 {{1 }}。此资源与范围 Bob
相关联。此外,还有一个权限将相关资源与名为 tournament/tekken6/bracket/{id}
的基于角色的策略相关联。如果 bracket:modify
是 Referee Role Required
,那么他将被授予 Bob
范围,但由于他不是,那么他将被拒绝该范围。
好的,理论到此为止。让我们设置我们的环境来演示所有这些。我正在使用以下内容:
Referee
的领域bracket:modify
的客户demo
的客户端范围my-demo-client
和 client_roles
paul
和 law
Admin
和 Reader
请注意,我将使用 Keycloak 12.0.4,我将跳过几乎所有的基本设置说明。我只会分享相关的部分。如果您不确定如何设置这一切,请查看 practical guide 或此 Getting Started Guide。答案包含第 8 版的步骤,但据我所知,差异非常小。
为了将 demo-admin
与 demo-reader
、paul
、Admin
和 Reader
角色相关联,请执行以下操作:
bank-admin
> bank-reader
> 单击 Users
的 View all users
值 > 单击 ID
> 在 paul
下移动 {{ Role Mappings
下的 1}} 和 Realm Roles
> 在 Admin
选择框下选择 Reader
,然后将 Assigned Roles
和 my-demo-client
移动到 Client Roles
下像这样demo-admin
,我们只会将他与 demo-reader
和 Assigned Roles
联系起来。通过以下方式创建客户端范围:
law
链接 > 单击 Reader
> 在 bank-reader
字段中输入 Client Scopes
并点击保存。它应该是这样的Create
> 选择 custom-client-scope
> 点击顶部的 Name
选项卡 > 为方便起见,让我们将其移至 Clients
。< /li>
我们可以通过 Keycloak 轻松为我们的设置生成访问令牌,以查看它的外观。为此:
点击 my-demo-client
下的 Client Scopes
标签。
选择Assigned Default Client Scopes
作为用户
点击蓝色的 Evaluate
按钮
点击 Client Scopes
。在检查令牌时,查找:
如果您为 scope
生成令牌,与 Client Scope
相比,您会看到更少的角色。
继续我们的设置:
custom-client-scope
资源,其中包含两个名为 law
和 paul
的 account/{id}
Authorization Scopes
和 account:read
,其中前者需要 account:modify
领域角色,而后者需要 Only Reader Role Policy
领域角色。这是一个示例供参考。请注意,如果您愿意,您可以在客户端级别进一步增强该策略,但为了简单起见,我选择不这样做。
此外,我创建了两个基于范围的权限,称为 Only Admin Role Policy
和 Reader
。
如果用户是 Admin
或 Read Account Scope Permission
,Modify Account Scope Permission
将授予 Read Account Scope Permission
account:read
.这里需要注意的一个关键事项是必须将决策策略设置为 Authorization Scope
才能实现此行为。
Admin
另一方面,将 Reader
Affirmative
授予具有 Modify Account Permission
角色的用户。account:modify
(记住他同时是 Authorization Scope
和 Admin
)针对 paul
,他将被授予 {{ 1}} 和 Admin
Reader
。让我们看看这是不是真的。这是我们的 Account Resource
屏幕,请注意我没有将任何角色与 account:read
关联,因为这已经通过 account:modify
> Authorization Scopes
标签Evaluate
的评估结果。由于他不是 paul
,他将被拒绝 Users
范围,但他将被授予 Role Mappings
范围。law
进一步确认这一点,其中显示了 Admin
的访问令牌中的权限希望这能帮助您了解每个拼图在您的架构中的位置。干杯!