使用 Keycloak API 以编程方式将角色分配给组

Posted

技术标签:

【中文标题】使用 Keycloak API 以编程方式将角色分配给组【英文标题】:Assign Roles programmatically to Groups with Keycloak API 【发布时间】:2018-03-30 07:38:25 【问题描述】:

目前我尝试使用 Keycloak API 和 Java 客户端。目前,我很难以编程方式将角色分配给组。不幸的是,此时文档还不是很详细。

这是我的示例代码:

@Test
public void testPushGroupWithRealmRoles() throws IOException 

    GroupRepresentation group = new GroupRepresentation();
    group.setName("JUnit Test Group realm roles");

    String editRoleName = "junit_edit";
    String deleteRoleName = "junit_delete";

    RoleRepresentation editRole = getRealmRole(editRoleName);
    if (editRole == null) 
        editRole = new RoleRepresentation(editRoleName, "is allowed to edit", false);
        getKeycloak().realm(clientConfig.getRealm()).roles().create(editRole);
    

    RoleRepresentation deleteRole = getRealmRole(deleteRoleName);
    if (deleteRole == null) 
        deleteRole = new RoleRepresentation(deleteRoleName, "is allowed to delete", false);
        getKeycloak().realm(clientConfig.getRealm()).roles().create(deleteRole);
    

    group.setRealmRoles(Arrays.asList(editRole.getName(), deleteRole.getName()));

    GroupResource existingGroup = getGroupRepresentation(group.getName());

    if(existingGroup != null)
        existingGroup.update(group);
     else
        getKeycloak().realm(clientConfig.getRealm()).groups().add(group);
    
 

如果不存在则创建组,如果不存在则创建角色但分配

group.setRealmRoles(Arrays.asList(editRole.getName(), deleteRole.getName()));

需要在字符串列表中作为参数给出什么?角色名称?角色的技术 ID? (两者都不适合我)。

感谢任何帮助!

更新 感谢ravthiru,我能够解决我的问题。工作代码是这样的:

@Test
public void testPushGroupWithRealmRoles() throws IOException 

    /*
    ensure the roles exist
     */
    String editRoleName = "junit_edit";
    String deleteRoleName = "junit_delete";

    RoleRepresentation editRole = getRealmRole(editRoleName);
    if (editRole == null) 
        editRole = new RoleRepresentation(editRoleName, "is allowed to edit", false);
        getKeycloak().realm(clientConfig.getRealm()).roles().create(editRole);
    

    RoleRepresentation deleteRole = getRealmRole(deleteRoleName);
    if (deleteRole == null) 
        deleteRole = new RoleRepresentation(deleteRoleName, "is allowed to delete", false);
        getKeycloak().realm(clientConfig.getRealm()).roles().create(deleteRole);
    


    /*
    ensure the group exists
     */
    GroupRepresentation group = new GroupRepresentation();
    group.setName("JUnit Test Group realm roles");

    GroupResource existingGroup = getGroupResource(group.getName());

    if (existingGroup != null) 
        existingGroup.update(group);
     else 
        getKeycloak().realm(clientConfig.getRealm()).groups().add(group);
    


    /*
    assign roles to group
     */
    existingGroup.roles().realmLevel().add(Arrays.asList(editRole, deleteRole));

【问题讨论】:

【参考方案1】:

如果您已经创建了角色,那么您可以使用以下代码将该角色与组关联。

 RoleRepresentation grouprole = realm.roles().get("grouprole").toRepresentation();

 List<RoleRepresentation> roles = new LinkedList<>();
 roles.add(grouprole);
 realm.groups().group(myGroup.getId()).roles().realmLevel().add(roles);

这里的“grouprole”角色关联到“myGroup”组

【讨论】:

非常感谢您的回答,这就像一个魅力。我能够使用您的方法以编程方式分配领域和客户角色。 有谁知道如何使用 nodejs 为组分配角色?

以上是关于使用 Keycloak API 以编程方式将角色分配给组的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 rest admin api 的情况下以编程方式(java)更新 keycloak 的用户详细信息?

Keycloak-向用户配置文件中添加角色

如何通过 REST API 将 Keycloak 领域角色添加到组

使用 Keycloak Admin Java API 向用户添加角色

KeyCloak - 以编程方式创建领域/用户/组?

使用 Keycloak 时模拟“生成 API 令牌”的最佳实践