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