0

目标是从我的 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);

    }

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

我不认为我走的好路..

4

1 回答 1

0

在这里找到答案:比较两个列表并获得差异

CollectionUtils.removeAll(rolesOfUserActual, rolesOfUserActualNew); // roles added
CollectionUtils.removeAll(rolesOfUserActualNew, rolesOfUserActual); //roles deleted
于 2021-10-31T19:42:16.303 回答