Keycloak: как программно добавить новые подгруппы с ассоциированными пользователями? - PullRequest
0 голосов
/ 24 января 2020

В Keycloak 8.0.1 у нас есть Область с Группой и Подгруппами, подобная этой:

group -
    subgroup1
    subgroup2
    ...

Нам нужно вставить группу подгрупп и пользователей в group. Подгруппа должна иметь некоторые атрибуты.

Как я могу это сделать?

Я пытался:

  1. Используя экспортированный файл realm-export.json с недавно добавленными подгруппами и " Перезаписать »на импорт. Сейчас я не вижу, как связать нового пользователя с подгруппой. И я также не уверен, что старые пользователи не будут удалены таким образом.
  2. Вызов API REST Keycloak. Кажется невозможным ОБНОВИТЬ группу и добавить подгруппы. Документация гласит:

    PUT /{realm}/groups/{id} Группа обновления, игнорирует подгруппы.

Теперь я рассматриваю использование инструмента тестирования пользовательского интерфейса для программного добавления пользователя, но это кажется излишне сложным.

можно программно добавить новые подгруппы с пользователями, связанными с этой подгруппой? Я что-то упускаю из-за вызова API REST или функции импорта? Есть ли другой способ, например, через Java Admin Client ?

1 Ответ

2 голосов
/ 24 января 2020

Вы можете создавать группы и подгруппы под ним. Вот пример кода для создания подгрупп с помощью Admin Client. Вы также можете связать пользователей с этими группами

 public void addSubgroups()  {
            RealmResource realm =keycloak.realm("myrealm");
            GroupRepresentation topGroup = new GroupRepresentation();
            topGroup.setName("group");
            topGroup = createGroup(realm, topGroup);

            createSubGroup(realm,topGroup.getId(),"subgroup1");
            createSubGroup(realm,topGroup.getId(),"subgroup2");
        }

       private void createSubGroup(RealmResource realm, String parentGroupId, String subGroupName) {
           GroupRepresentation subgroup = new GroupRepresentation();
             subgroup.setName(subGroupName);
           try (Response response = realm.groups().group(parentGroupId).subGroup(subgroup)){
                if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) {
                    System.out.println("Created Subgroup : " + subGroupName );
                } else {
                    logger.severe("Error Creating Subgroup : " + subGroupName + ", Error Message : " + getErrorMessage(response));
                }
            } 
       }

       private GroupRepresentation createGroup(RealmResource realm, GroupRepresentation group) {
            try (Response response = realm.groups().add(group)) {
                String groupId = getCreatedId(response);           
                group.setId(groupId);
                return group;
            }
        }    
...