Keycloak java api 获取给定客户端的服务帐户用户

Keycloak java api fetch service account user for given client

我正在使用 Keycloak 版本 3.4。3.Final 社区版本(我知道它是一个旧版本,由于业务原因无法更新)和它对应的 java 客户端,我创建了一个标志 serviceAccountEnabled 设置为 true 的客户端需要将 realm-management 客户端的角色分配给它,即来自 service-account-roles.

部分

我能够成功创建客户端,但无法将 realm-management 客户端的角色分配给它,因为它需要获取 service-account-user 每次都返回 null,下面是我的代码片段

创建客户端的代码

            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

的代码
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

使用 RealmManager 和 ClientManager keycloak API。