Keycloak映射多个用户属性

时间:2020-03-20 00:45:01

标签: keycloak

我已经按照[1]中的指南来映射单个用户属性。但是,我需要将所有属性映射到数组,以便特定用户的每个属性都显示在访问令牌的属性数组中(或者更好,将属性限制为一组特定的属性,但是我想用户属性仅仅是平面键/值映射)。

我尝试在客户端映射器的“用户属性”字段中设置通配符*。但是无论我做什么,只要给定用户属性映射的实际属性键,就一次只能设置一个属性。

[1] Keycloak retrieve custom attributes to KeycloakPrincipal

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题。

我尝试了以下操作:

  1. 添加了具有单个值的键“部门”,例如“财务”。 添加另一个键“部门”和另一个值“开发” 覆盖初始条目。
  2. 我也想放点东西 例如值列中的列表,例如“开发,财务”或 “发展;财务”,但这也被视为单一价值。

如果您在管理控制台中使用“ development ## finance”,则用户将具有“部门”属性,其中包含两个值:“开发”和“财务”。

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

因此,如果您在protocolMapper中将“多值”开关标记为“部门”属性,则accessToken将包含带有两个值的列表“开发”和“财务”。

“部门”:[ “发展”, “金融” ]

这对我有用。

KeyCloak版本11.0.2

答案 1 :(得分:0)

您可以编写自己的Keycloak扩展名。一种解决方案是编写自定义Authenticator,您可以在其中: 过滤用户属性->连接属性值->将结果JSON数组写为用户会话注释。

然后添加Client Mapper,它将该会话注释映射到单个声明中。

答案 2 :(得分:0)

我不能 100% 确定您在此处寻找什么,但我知道这是我在 google 上搜索我要寻找的内容时出现的第一个结果,所以我会在此处发布该答案。

>

假设您希望在 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 中使用映射器时,请在您的令牌声明名称 (Room_Info) 前面加上一个点。 keycloak_user_attributes

应该可以。