我正在使用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
的方向。
答案 0 :(得分:0)
使用RealmManager和ClientManager keycloak API使其正常工作。