Keycloak java api извлекает учетную запись пользователя сервиса для данного клиента - PullRequest
0 голосов
/ 06 февраля 2020

Я использую Keycloak версии 3.4.3. Окончательная версия сообщества (я знаю, что это более старая версия и не может обновить ее по деловым причинам) и соответствующий ей клиент java, я создал клиента с флагом serviceAccountEnabled установлен на true и ему необходимо назначить realm-management роли клиента, т.е. из раздела service-account-roles.

Я могу успешно создать клиента, но не могу назначить ему realm-management роли клиента как он требует выборки service-account-user, которая каждый раз возвращает ноль, ниже приведен мой фрагмент кода

Код для создания клиента

            KeycloakTransaction tx = session.getTransactionManager();
            tx.begin();
            ClientModel clientModel = myRealm.addClient("myClient-id");
            clientModel.setClientId("myClient-id");
            clientModel.setClientAuthenticatorType("client-secret");
            clientModel.setStandardFlowEnabled(false);
            clientModel.setWebOrigins(Collections.emptySet());
            clientModel.setRedirectUris(Collections.emptySet());
            clientModel.setDirectAccessGrantsEnabled(false);
            clientModel.setImplicitFlowEnabled(false);
            clientModel.setServiceAccountsEnabled(true);
            clientModel.setPublicClient(false);
            clientModel.setProtocol("openid-connect");
            clientModel.setFullScopeAllowed(false);
            //need to inject this from env
            clientModel.setSecret("12345");
            clientModel.updateClient();
            commitOrRollbackTransaction(tx);

Код для назначения realm-management ролей для service-account-user* клиента 1016 *

KeycloakTransaction tx = session.getTransactionManager();
tx.begin();
RealmModel myRealm = keycloakSession.realms().getRealmByName("myRealm");
ClientModel clientModel = myRealm.getClientByClientId("myClient-id");
ClientModel realmManagementClient = myRealm.getClientByClientId("realm-management");
Set<RoleModel> roles = realmManagementClient.getRoles();
UserModel serviceAccountUser = keycloakSession.users().getServiceAccount(clientModel);
if(serviceAccountUser != null){
   roles.stream().forEach(r -> serviceAccountUser.grantRole(r));
 }
tx.commit();

Проблема в том, что я не получаю service-account-user для клиента, которого я создал на предыдущем шаге, однако я проверил, что пользователь создан, также я могу получить service-account-user для существующих клиентов, это больше похоже на проблему транзакции, но я выполняю создание клиента и назначение ролей в двух разных сеансах.

Может кто-нибудь указать мне, где я ошибаюсь, или указать, как получить service-account-user.

1 Ответ

0 голосов
/ 10 февраля 2020

Получил работу, используя RealmManager и ClientManager Keycloak API.

...