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

Posted

技术标签:

【中文标题】使用 Keycloak Admin Java API 向用户添加角色【英文标题】:Add role to user using Keycloak Admin Java API 【发布时间】:2021-12-15 16:37:33 【问题描述】:

目标是从我的 Angular 前端管理用户的角色。 前台将向我发送为用户指定的更新角色。

其实用户有["ROLE_A"]

管理员更新用户的角色。

现在前台向我发送:["ROLE_A","ROLE_B","ROLE_C"] 给定用户。

我的目标是能够更新此用户的角色。

可以有比以前更多或更少的权利。 (“差异列表”“正在工作”..(404 错误)仅当有比以前新的角色时.. 但不是当我删除一些角色时..)


public void updateUserRoles() 
        
        keycloak = keycloakService.getInstance();
        List<RoleRepresentation> rolesOfUserActual = keycloak.realm("api").users().get("95315cf6-b10f-4b6c-a8ac-f60ca4820307").roles().realmLevel().listAll();
        List<RoleRepresentation> rolesOfUserActualNew = keycloak.realm("api").users().get("95315cf6-b10f-4b6c-a8ac-f60ca4820307").roles().realmLevel().listAll();

        RoleRepresentation newrole = new RoleRepresentation("ROLE_READ_GROUPS", null, false); // this role already exists in keycloak.
        rolesOfUserActualNew.add(newrole);
        
        
        List<RoleRepresentation> differences = rolesOfUserActual.stream()
                .filter(name -> !rolesOfUserActualNew.contains(name))
                .collect(Collectors.toList());
        
        
        List<RoleRepresentation> roleToAdd = new ArrayList();
        List<RoleRepresentation> roleToDelete = new ArrayList();

        
        differences.forEach((role) -> 
            if(rolesOfUserActual.contains(role)) 
                roleToDelete.add(role);
            else 
                roleToAdd.add(role);
            
        );
        
        keycloak.realm("api").users().get("95315cf6-b10f-4b6c-a8ac-f60ca4820307").roles().realmLevel().add(roleToAdd);
        keycloak.realm("api").users().get("95315cf6-b10f-4b6c-a8ac-f60ca4820307").roles().realmLevel().remove(roleToDelete);

    

我不明白为什么更新角色这么复杂(很多列表):(

我认为我没有走好路..

【问题讨论】:

【参考方案1】:

在这里找到答案:Comparing two lists and getting differences

CollectionUtils.removeAll(rolesOfUserActual, rolesOfUserActualNew); // roles added
CollectionUtils.removeAll(rolesOfUserActualNew, rolesOfUserActual); //roles deleted

【讨论】:

以上是关于使用 Keycloak Admin Java API 向用户添加角色的主要内容,如果未能解决你的问题,请参考以下文章

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

一篇学会java调用Keycloak Admin-cli User和Group Api

一篇学会java调用Keycloak Admin-cli User和Group Api

通过 keycloak admin 客户端在 keycloak 中创建用户返回 IllegalArgumentException

Springboot 集成keycloak admin-cli api

Keycloak:使用 keycloak-admin 为用户生成访问令牌