Keycloak Java客户端创建带自定义属性的角色失败求助
解决Keycloak 11.0.0 Admin Client创建角色时自定义属性被忽略的问题
我之前在使用Keycloak 11.0.0和对应版本的Admin Client时,也碰到过完全一样的问题——创建客户端角色时自定义属性总是被服务端忽略。后来排查发现这是该版本的一个小局限,通过分两步操作就能解决:
问题原因
Keycloak 11.0.0的角色创建端点(POST /{realm}/clients/{clientId}/roles)对attributes字段的处理存在缺陷,直接传递带属性的RoleRepresentation时,服务端不会持久化这些属性。但角色更新端点(PUT /{realm}/clients/{clientId}/roles/{roleName})则能正确处理属性字段。
修复后的代码
我们可以先创建基础角色,再获取该角色并更新其属性:
public void createRole(String name) { // 第一步:创建不带属性的基础客户端角色 RoleRepresentation roleRepresentation = new RoleRepresentation(); roleRepresentation.setClientRole(true); roleRepresentation.setName(name); realm.clients().get(client.getId()).roles().create(roleRepresentation); // 第二步:获取刚创建的角色,添加自定义属性后更新 RoleRepresentation createdRole = realm.clients().get(client.getId()).roles().get(name).toRepresentation(); Map<String, List<String>> attributes = new HashMap<>(); attributes.put("att1", Collections.singletonList("attribute1")); attributes.put("att2", Collections.singletonList("attribute2")); createdRole.setAttributes(attributes); realm.clients().get(client.getId()).roles().get(name).update(createdRole); }
额外说明
- 这个问题在Keycloak 12.0.0及以上版本中已经被官方修复,如果你有升级的可能,升级后就能直接通过
create方法传递属性。 - 确保你在操作时使用的Admin Client版本和Keycloak服务端版本完全一致(都是11.0.0),版本不匹配也可能导致这类序列化/字段解析问题。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

