从Java API访问keycloak角色/用户属性

时间:2019-04-16 06:59:07

标签: java oauth-2.0 openid-connect keycloak

我在Keycloak中创建了一个角色和一个用户,并在两个角色中都添加了一个属性;例如:

my_role_attr = 'x'
my_user_attr = 'y'

然后我正在尝试访问该信息。通过JAVA KeycloakSecurityContext(以及关联的AccessToken / IDToken)。我可以看到角色的名称和用户信息,但是找不到那些属性。

我知道我必须创建一个协议映射器“用户属性”,以将“ my_user_attr”映射到令牌声明中。那就可以在AccessToken / IDToken中获取值了。

但是我找不到获取角色属性的方法。我没有看到任何“ Protocol Mapper”作为角色属性。我想念什么吗?

3 个答案:

答案 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