我已经按照[1]中的指南来映射单个用户属性。但是,我需要将所有属性映射到数组,以便特定用户的每个属性都显示在访问令牌的属性数组中(或者更好,将属性限制为一组特定的属性,但是我想用户属性仅仅是平面键/值映射)。
我尝试在客户端映射器的“用户属性”字段中设置通配符*。但是无论我做什么,只要给定用户属性映射的实际属性键,就一次只能设置一个属性。
[1] Keycloak retrieve custom attributes to KeycloakPrincipal
答案 0 :(得分:5)
我遇到了同样的问题。
我尝试了以下操作:
如果您在管理控制台中使用“ 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) 前面加上一个点。
应该可以。