首页 > 解决方案 > Keycloak:在生成的令牌中包含请求范围的角色

问题描述

我目前正在尝试将 Keycloak 作为 OICD/OAuth 提供程序,并计划根据我的应用程序中的角色将其用于授权。为此,我需要角色来申请包含在生成的访问令牌中的会话。

我的计划如下:

到目前为止,这一切都是可能的,除了生成的访问令牌中有趣的“角色”声明包含用户的所有角色,而不仅仅是分配给请求范围的角色。

所以我的问题是:

例子:

我们有以下范围角色映射:

范围 角色
r_read
r_write

以及具有“r_read”和“r_write”角色的用户。

当用户使用请求的“读取”范围登录时,我希望生成的访问令牌中的“角色”数组仅包含“r_read”角色。相反,它目前还包含“r_write”角色。

更新:

经过更多挖掘后,我认为我被“客户端范围”详细信息配置中的“范围”选项卡的文档误导(或误解了它):

Scope mappings allow you to restrict which user role mappings are included within the access token requested by the client.

在那里设置的分配角色仅控制需要哪个角色,以便可以将范围应用于/添加到scope访问令牌的声明中。

我目前看到的可能性是:

标签: keycloakopenid-connect

解决方案


是的你可以。简单的方法:

  1. Clients Scopes在菜单部分[ /auth/admin/master/console/#/realms/<your realm>/client-scopes]中创建所需的范围,将其命名为:(read例如)
    您可以关闭选项Display On Consent Screen & Include In Token Scope。我们不需要它

  2. 范围保存后转到MAPPER选项卡(范围read

  • 按下CREATE按钮
  • 映射器类型 = Hardcoded Role; 名称 = r_read; 角色=r_read
  • 节省!
  1. 将范围 ( read) 添加到Optional Client Scopes您的主客户端[ /auth/admin/master/console/#/realms/<your realm>/clients/<your client UUID>/client-scopes/setup-scopes]
  2. 现在请求具有范围 ( read)的访问令牌
  3. 瞧!现在realm_access.roles,您的访问令牌部分将如下所示:
  "realm_access": {
    "roles": [
      "offline_access",
      "uma_authorization",
      "r_read"
    ]
  }

推荐阅读