如何管理Keycloak角色?

Oli*_*alo 7 keycloak

Keycloak是一个很棒的工具,但缺乏适当的文档.

所以我们有Realm.roles,Client.roles和User.roles

使用特定客户端访问应用程序时,3如何协同工作?

此致

Din*_*ino 22

在KeyCloak中,我们有以下3个角色:

  1. 境界 角色
  2. 客户 角色
  3. 复合 角色

KeyCloak中没有用户角色.您最有可能将其与用户角色映射混淆,用户角色映射基本上是将角色(领域,客户端或组合)映射到特定用户

为了找出这些角色的实际工作方式,让我们先来看看我创建的一个简单的Realm模型.如下图所示,每个Realm都有一个或多个客户端.每个客户端都可以连接多个用户.

在此输入图像描述

现在,从中可以很容易地得出角色映射的工作原理.

领域角色:它是一个全球角色,属于该特定领域.您可以从任何客户端访问它并映射到任何用户.前角色: '全球管理员,管理员'

客户端角色:该角色仅属于该特定客户端.您无法从其他客户端访问该角色.您只能将其映射到该客户端的用户.前角色: '员工,客户'

复合角色:它是一个角色,具有与之关联的一个或多个角色(领域或客户角色).

  • 谢谢,不是我更困惑了...示波器在图片中如何发挥作用?客户端角色是增加还是限制领域角色?如果我有一个 Web 应用程序客户端和一个移动客户端,并且两者共享相同的客户端角色,该怎么办? (4认同)
  • 谢谢,我知道了-再一次,该领域的keycloak文档确实很薄弱。我终于了解了客户端如何根据作用域“过滤”用户角色。从您的评论中,我还发现可以跨多个客户端“复制” roleId。 (2认同)

dre*_*ash 16

IMO 该线程中有一些不准确之处;希望我的回答能帮助澄清它们。

在由两位核心开发人员撰写的题为“Keycloak - 现代应用程序的身份和访问管理:利用 Keycloak、OpenID Connect 和 OAuth 2.0 协议的力量来保护应用程序”的Keycloak 一书中,可以阅读以下内容:

Keycloak有两类角色:领域角色和客户端角色。

顾名思义,领域角色是在领域级别定义的,而客户端角色则与给定客户端相关联。从语义上讲,领域角色代表整个组织内的用户角色(由领域代表)。客户端角色代表仅在该客户端内有意义的“角色”。

让我们举一个具体的例子:我们有一个Realm A(代表一家公司)包含三个名为accountwebapp1和 的客户webapp2;第一个客户端默认使用 Keycloak (KC) 进行部署,而其余客户端则特定于我们的假想组织。

有两种类型的用户可以使用我们的网络应用程序:普通用户和管理员用户。这些可以分别由角色user和来表示admin。由于这些角色跨越我们的领域客户,同时保留其含义,因此它们是领域角色的良好候选者。因此,在 KC 中,我们将它们创建为领域角色,并最终相应地将它们分配给用户。在访问令牌中,这些角色将显示如下:

"realm_access": {
   "roles": [
     "admin",
     "regular"
 ]
}
Run Code Online (Sandbox Code Playgroud)

如果在KC中创建一个新用户,然后在选项卡下Role Mappings检查用户角色:

(新用户界面)

在此输入图像描述

(旧用户界面)

在此输入图像描述

可以看到,用户将被分配(帐户)客户端角色 manage-accountmanaged-account-links、 和view-profile。这些角色仅对该客户有意义;例如,它们对于我们的网络应用程序来说毫无意义。因此,这些都是客户端角色的好例子,因为它们的含义与特定客户端( )紧密耦合account。在访问令牌中,这些角色将显示如下:

"resource_access": {
   "account": [
     "roles": [
       "manage-account",
       "managed-account-links",
       "view-profile"
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

现在让我们想象一下,用户可以在我们的每个网络应用程序上购买高级帐户。为了向我们的应用程序发出用户是否拥有(或没有)高级帐户的信号,我们创建了 角色premium

该角色应该premium领域角色还是客户端角色?由于用户可以在一个网络应用程序中拥有高级帐户,而不必在另一个网络应用程序中拥有高级帐户,因此我们应该创建premium一个客户端角色。因此,对于每个客户,我们都会有一个名为“高级”的单独角色。尽管角色名称相同,但含义会根据客户的不同而变化。in并不意味着用户拥有in premium,反之亦然。webapp1premiumwebapp2

访问令牌可能如下所示:

"resource_access": {
   "webapp1": [
     "roles": [
       "premium",
       ...
    ]
   "webapp2": [
     "roles": [
       ....
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

每个应用程序都可以轻松浏览 JWT 并验证用户是否拥有与该应用程序关联的高级帐户。

如果我们现在更改要求,以便用户只能拥有一个全局高级帐户,该帐户可以访问 中所有 Web 应用程序的所有功能,那么Realm A该角色premium应该成为领域角色,因为它现在具有全局含义:是横向于客户的Realm A

复合角色

Keycloak官方文档可以看到:

复合角色是可以与其他角色关联的角色。

因此,如果我们有一个role A由 组成的role B,每当我们分配role A给一个用户时,role B也会自动分配给该用户。但是,如果我们只是分配role B,则role A不会自动分配。这是因为role A是由组成的role B,而不是相反。

回到我们的示例,角色可以由领域角色和来自和 的客户端角色admin组成。 regular premiumwebapp1webapp2

特殊情况(服务帐户角色)

通常,角色被显式分配给用户;但是,在 KC 中,只要客户端启用了客户端凭据授予(或使用KC 术语) ,也可以“向客户端分配角色”Service accountService accounts roles

(新用户界面)

在此输入图像描述

(旧用户界面)

在此输入图像描述

实际上,KC 创建一个隐式用户并将其关联到该客户端,因此最终角色会隐式分配给该用户。