Keycloak - 基于资源的角色和范围基础身份验证

时间:2021-03-16 17:26:37

标签: keycloak

我有一个场景,我想在 keycloak 中限制用户

我有用户

用户可以访问多个帐户 在多个帐户中,使用可以是管理员或代理(读者)

user
|
|
|-------account-1
|            |
|            |-------admin
|-------account-2
|            |
|            |-------agent

我们如何在 Keycloak 中将其映射到策略、权限和角色?

任何参考文档任何例子都非常有帮助

也基于:Resources, scopes, permissions and policies in keycloak

根据 Andy 的回答,我创建了一个资源帐户和角色管理员和代理。

创建与示例相同的策略。

我期待将范围(身份验证范围)和角色添加到 JWT 令牌如何映射该部分,以便 API 网关或服务可以进一步验证。

1 个答案:

答案 0 :(得分:2)

<块引用>

@changa,我根据我们的讨论重写了我的答案。希望这会有所帮助!

在我回答之前,让我先澄清一些关键领域。我对您链接的 answer 的主要关注点实际上是关于如何使用 Evaluate 工具,我并没有真正深入研究某些概念 - 所以让我们这样做:)

在 Keycloak 中,您会遇到客户端和授权范围。有关这些术语的正式定义,请查看服务器管理指南中的 Core Concepts and Terms,但简单地说:

客户端范围是在通过 scope 参数请求客户端时授予给客户端的范围(一旦资源所有者允许)。请注意,还有 Default Client Scope 的概念,但我选择保持简单。此外,您可以利用协议和角色范围映射器来定制访问令牌中存在的声明和断言。

授权范围另一方面,在针对受保护资源成功评估策略后,授予给客户端。这些范围不会根据用户同意授予客户端。

两者之间的主要区别实际上是客户端获取这些范围的时间和方式。为了帮助您形象化所有这些,这里有一个场景:

  1. 一位名叫 Bob 的著名武术家通过 Keycloak 进行身份验证

  2. Bob 会看到一个同意屏幕,要求他分享自己的姓名、战斗风格和年龄。

  3. Bob 选择公开自己的姓名和战斗风格,但拒绝透露自己的年龄。

  4. 当我们现在检查令牌时,我们会看到访问令牌的 scope 属性的以下(完全构成的)条目:namefighting_style。< /p>

  5. 此外,假设我们已经设置了几个协议映射器(例如用户属性映射器类型 - 有很多)以通过以下令牌声明显示全名和战斗风格的值:{ {1}} 和 fighter_name 当访问令牌中存在上述两个 martial_arts 时。除了前面提到的两个范围之外,我们还会在检查访问令牌时看到类似 Client Scopesfighter_name: Robert Richards 的内容。

    • 旁注:鉴于此答案的长度,我决定跳过此主题,但请在大约 7 分钟标记处查看此 awesome video 以及相关的 {{ 3}} 了解更多信息。 README 非常好。
  6. 此外,假设 martial_arts: Freestyle Karate 映射到名为 Bob 的领域角色和 Contestant 的客户端角色,并且我们确实在 Keycloak 中设置了任何限制分享这些信息。因此,除了上面提到的所有内容之外,我们还会在令牌中看到这些信息。

    • 不用说,这对我来说过于简单化了,因为我只是在为演示搭建舞台。访问令牌中包含更多信息。
  7. Fighter 不喜欢锦标赛支架的布局,因为他渴望尽快与世界冠军争夺战,因此他尝试通过发送针对 {{1 }}。此资源与范围 Bob 相关联。此外,还有一个权限将相关资源与名为 tournament/tekken6/bracket/{id} 的基于角色的策略相关联。如果 bracket:modifyReferee Role Required,那么他将被授予 Bob 范围,但由于他不是,那么他将被拒绝该范围。

    • 谈到 Keycloak 中授权过程的内部工作原理时,我几乎没有触及表面。如需更多信息,请查看此 GitHub Project。您可以使用 UMA 做一些非常酷的事情。

好的,理论到此为止。让我们设置我们的环境来演示所有这些。我正在使用以下内容:

  • 名为 Referee 的领域
  • 一个名为 bracket:modify 的客户
  • 名为 demo 的客户端范围
  • 2 个用户 - my-demo-clientclient_roles
  • 两个领域级别的角色 - paullaw
  • 两个客户端级角色 - AdminReader
<块引用>

请注意,我将使用 Keycloak 12.0.4,我将跳过几乎所有的基本设置说明。我只会分享相关的部分。如果您不确定如何设置这一切,请查看 practical guide 或此 Getting Started Guide。答案包含第 8 版的步骤,但据我所知,差异非常小。

关联用户和角色

为了将 demo-admindemo-readerpaulAdminReader 角色相关联,请执行以下操作:

  • 单击 bank-admin > bank-reader > 单击 UsersView all users 值 > 单击 ID > 在 paul 下移动 {{ Role Mappings 下的 1}} 和 Realm Roles > 在 Admin 选择框下选择 Reader,然后将 Assigned Rolesmy-demo-client 移动到 Client Roles 下像这样

answer

  • 至于 demo-admin,我们只会将他与 demo-readerAssigned Roles 联系起来。

将客户端范围与客户端相关联

通过以下方式创建客户端范围:

  • 单击左侧的 law 链接 > 单击 Reader > 在 bank-reader 字段中输入 Client Scopes 并点击保存。它应该是这样的

enter image description here

  • 点击左侧的 Create > 选择 custom-client-scope > 点击顶部的 Name 选项卡 > 为方便起见,让我们将其移至 Clients。< /li>

检查访问令牌

我们可以通过 Keycloak 轻松为我们的设置生成访问令牌,以查看它的外观。为此:

  • 点击 my-demo-client 下的 Client Scopes 标签。

  • 选择Assigned Default Client Scopes作为用户

  • 点击蓝色的 Evaluate 按钮

  • 点击 Client Scopes。在检查令牌时,查找:

    • paul 查看与 Evaluate 关联的客户端级角色
    • Generated Access Token 查看 resource_access 的领域级别角色
    • paul 查看我们创建的名为 realm_accesspaul enter image description here enter image description here
  • 如果您为 scope 生成令牌,与 Client Scope 相比,您会看到更少的角色。

获得政策评估后的范围

继续我们的设置:

  • 我创建了一个 custom-client-scope 资源,其中包含两个名为 lawpaulaccount/{id}

enter image description here

  • 此外,我创建了两个基于角色的策略,称为 Authorization Scopesaccount:read,其中前者需要 account:modify 领域角色,而后者需要 Only Reader Role Policy 领域角色。这是一个示例供参考。

enter image description here

  • 请注意,如果您愿意,您可以在客户端级别进一步增强该策略,但为了简单起见,我选择不这样做。

  • 此外,我创建了两个基于范围的权限,称为 Only Admin Role PolicyReader

  • 如果用户是 Admin Read Account Scope PermissionModify Account Scope Permission 将授予 Read Account Scope Permission account:read .这里需要注意的一个关键事项是必须将决策策略设置为 Authorization Scope 才能实现此行为。

enter image description here

  • Admin 另一方面,将 Reader Affirmative 授予具有 Modify Account Permission 角色的用户。

enter image description here

  • 现在,如果您选择评估用户 account:modify(记住他同时是 Authorization ScopeAdmin)针对 paul,他将被授予 {{ 1}} 和 Admin Reader。让我们看看这是不是真的。这是我们的 Account Resource 屏幕,请注意我没有将任何角色与 account:read 关联,因为这已经通过 account:modify > Authorization Scopes 标签

enter image description here

  • 这是该评估的预测结果

enter image description here

  • 这是 Evaluate 的评估结果。由于他不是 paul,他将被拒绝 Users 范围,但他将被授予 Role Mappings 范围。

enter image description here

  • 最后,我们可以通过点击 law 进一步确认这一点,其中显示了 Admin 的访问令牌中的权限

enter image description here

希望这能帮助您了解每个拼图在您的架构中的位置。干杯!