Keycloak映射多个用户属性

6
我已经按照[1]的指南映射了单个用户属性。但是,我需要将所有属性映射到一个数组中,以便特定用户的每个属性都显示在访问令牌的属性数组中(或更好的方法是将属性限制为某些属性组,但我想用户属性只是一个平面键/值映射)。
我尝试在客户端映射器的“User Attribute”字段中设置通配符*。但无论我做什么,我都只能针对用户属性映射的实际属性键设置一个属性。
[1]Keycloak检索KeycloakPrincipal的自定义属性
4个回答

14

我遇到了同样的问题。

我尝试了以下方法:

  1. 添加一个键"department",并为其设置单个值,例如"finance"。再添加第二个键"department"并设置另一个值"development"会覆盖初始输入。
  2. 我还尝试将列表之类的东西放入值列中,例如"development, finance"或"development; finance",但这也被视为单个值。

如果您在管理控制台中使用"development##finance",则用户将具有"department"属性,其值为"development"和"finance"。

"##"似乎是要使用的分隔符。

因此,如果您在协议映射器中为"department"属性标记"multivalued"开关,则accessToken将包含具有2个值"development"和"finance"的列表。

"department": [ "development", "finance" ]

这对我起作用了。

KeyCloak版本11.0.2


JSON怎么样? - SANDEEP MACHIRAJU
这应该被标记为此问题的答案。 太糟糕了,这个##分隔符在任何地方都没有记录...是吗?因为我找不到任何相关信息。你是怎么知道要尝试什么才能让它工作的? - CesarD
同样适用于Keycloak 17.0.1。谢谢。 - tnishada

3

我不确定您在这里寻找什么,但当我谷歌我所需要的内容时,这是第一个结果,所以我将在此发布答案。

假设您想要在Keycloak中设置多值用户属性集合的JWT,但是您的属性名称不同。例如,您有以下键值集合:

Room : Bedrooom
Floor: Tile
Paint: White

接下来,您希望在JWT中包含这些值。

{
  "exp": xxxxxxxxxx,
  "iat": xxxxxxxxxx,
  "jti": "xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
  "iss": "xxxxxxxxx",
  ...
  "Room_Info":{
    Room : Bedrooom
    Floor: Tile
    Paint: White
   }
  ...
}

当使用Keycloak中的映射器时,请在Token Claim Name(Room_Info)前加上一个点。 keycloak_user_attributes 这样就可以了。

0

您可以编写自己的Keycloak扩展。一种解决方案是编写自定义身份验证器,在其中可以:

过滤用户属性 -> 合并属性值 -> 将结果JSON数组作为用户会话注释写入。

然后添加客户端映射器,将此会话注释映射到单个声明。


0

实际上有一个更简单的解决方案(我在Keycloak版本>=21上成功测试过,但可能也适用于之前的版本)。

您只需简单地添加多个具有相同键的属性:

User Attributes

一个多值客户端范围映射器(请参考Woodys的回答)将把所有的值合并到令牌中的单个数组中。

Token

请注意:当您使用Admin API更新用户属性时,必须将属性作为数组发送,以免覆盖任何现有值。
{
   "attributes":{
      "data-disclosure":[
         "{\"version\":1,\"grantedAt\":\"2023-07-21T13:47:41.357Z\"}",
         "{\"version\":2,\"grantedAt\":\"2023-07-21T13:47:41.357Z\"}"
      ]
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接