我在Keycloak中创建了一个角色和一个用户,并在两个角色中都添加了一个属性;例如:
my_role_attr = 'x'
my_user_attr = 'y'
然后我正在尝试访问该信息。通过JAVA KeycloakSecurityContext(以及关联的AccessToken / IDToken)。我可以看到角色的名称和用户信息,但是找不到那些属性。
我知道我必须创建一个协议映射器“用户属性”,以将“ my_user_attr”映射到令牌声明中。那就可以在AccessToken / IDToken中获取值了。
但是我找不到获取角色属性的方法。我没有看到任何“ Protocol Mapper”作为角色属性。我想念什么吗?
答案 0 :(得分:0)
我一直在尝试做同样的事情;这并不容易,但是您可以成功使用脚本映射器。 https://github.com/keycloak/keycloak/blob/master/server-spi/src/main/java/org/keycloak/models/RoleModel.java的源代码包含一些有用的信息。 SO项(感谢Andre B)也提供了有用的信息How to create a Script Mapper in Keycloak?。
我(不是完美的还是完整的)解决方案是:
/**
* Available variables:
* user - the current user
* realm - the current realm
* token - the current token
* userSession - the current userSession
* keycloakSession - the current userSession
*/
var roles = [];
var client = keycloakSession.getContext().getClient();
user.getClientRoleMappings(client).forEach(function(roleModel) {
var attr = [];
var names = {};
var rn = roleModel.getName();
var map = roleModel.getAttributes();
map.forEach(function(key, value){
var k = {};
var a = false;
value.forEach(function(l){
a = (l === 'true');
});
k[key] = a;
attr.push(k);
});
names[rn] = attr;
roles.push(names);
});
exports = roles;
请注意,您可能需要将“多值”设置为“ ON”,并将“声明JSON类型”设置为“选择一个..”。
答案 1 :(得分:0)
更通用的答案应该是
var client = keycloakSession.getContext().getClient();
user.getRoleMappings().forEach(function(roleModel) {
var attr = {};
var names = {};
var rn = roleModel.getName();
var map = roleModel.getAttributes();
map.forEach(function(key, value){
attr[key] = value;
});
roles[rn] = attr;
});
exports = roles;
导出角色的属性,例如
"Role1": {
"key1": [
"Values1"
],
"key2": [
"values2"
]
}
答案 2 :(得分:0)
不,您没有遗漏任何东西。它只是没有实施。 但是,有一个功能请求。您可能想观看并投票支持 https://github.com/KarypisLab/SLIM.git。