给定客户端的Keycloak Java API获取服务帐户用户

时间:2020-02-06 12:06:37

标签: jboss transactions keycloak jta keycloak-services

我正在使用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

的代码
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 :(得分:0)

使用RealmManager和ClientManager keycloak API使其正常工作。