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

Mar*_*zzi 5 java oauth-2.0 openid-connect keycloak

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

my_role_attr = 'x'
my_user_attr = 'y'
Run Code Online (Sandbox Code Playgroud)

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

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

但我找不到获取角色属性的方法。我没有看到任何角色属性的“协议映射器”。我是不是错过了什么。

小智 8

我一直在努力做同样的事情;这并不容易,但是您可以使用脚本映射器取得一些成功。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;
Run Code Online (Sandbox Code Playgroud)

请注意,您可能需要将“多值”设置为“ON”,并将“声明 JSON 类型”设置为“选择一个..”。