Manage service accounts when updating a client using registration

Closes #44257

Signed-off-by: rmartinc <rmartinc@redhat.com>
This commit is contained in:
rmartinc
2025-12-04 16:40:36 +01:00
committed by Marek Posolda
parent 590538c99d
commit 43c1a169e4
2 changed files with 23 additions and 0 deletions

View File

@@ -55,6 +55,7 @@ import org.keycloak.services.clientregistration.policy.ClientRegistrationPolicyM
import org.keycloak.services.clientregistration.policy.RegistrationAuth;
import org.keycloak.services.managers.ClientManager;
import org.keycloak.services.managers.RealmManager;
import org.keycloak.services.resources.admin.ClientResource;
import org.keycloak.validation.ValidationUtil;
/**
@@ -171,6 +172,7 @@ public abstract class AbstractClientRegistrationProvider implements ClientRegist
throw new ErrorResponseException(ErrorCodes.INVALID_CLIENT_METADATA, "Client Identifier modified", Response.Status.BAD_REQUEST);
}
ClientResource.updateClientServiceAccount(session, client, rep.isServiceAccountsEnabled());
RepresentationToModel.updateClient(rep, client, session);
RepresentationToModel.updateClientProtocolMappers(rep, client);
RepresentationToModel.updateClientScopes(rep, client);

View File

@@ -42,6 +42,7 @@ import org.keycloak.client.registration.Auth;
import org.keycloak.client.registration.ClientRegistration;
import org.keycloak.client.registration.ClientRegistrationException;
import org.keycloak.client.registration.HttpErrorException;
import org.keycloak.common.constants.ServiceAccountConstants;
import org.keycloak.common.util.CollectionUtil;
import org.keycloak.events.Errors;
import org.keycloak.models.Constants;
@@ -154,6 +155,26 @@ public class ClientRegistrationTest extends AbstractClientRegistrationTest {
}
}
@Test
public void updateServiceAccount() throws Exception {
authManageClients();
ClientRepresentation client = buildClient();
final ClientRepresentation createdClient = registerClient(client);
client = reg.get(CLIENT_ID);
assertFalse(client.isServiceAccountsEnabled());
assertTrue(adminClient.realm(REALM_NAME).users().search(ServiceAccountConstants.SERVICE_ACCOUNT_USER_PREFIX + client.getClientId(), true).isEmpty());
client.setServiceAccountsEnabled(true);
client = reg.update(client);
assertTrue(client.isServiceAccountsEnabled());
assertFalse(adminClient.realm(REALM_NAME).users().search(ServiceAccountConstants.SERVICE_ACCOUNT_USER_PREFIX + client.getClientId(), true).isEmpty());
client.setServiceAccountsEnabled(false);
client = reg.update(client);
assertFalse(client.isServiceAccountsEnabled());
assertTrue(adminClient.realm(REALM_NAME).users().search(ServiceAccountConstants.SERVICE_ACCOUNT_USER_PREFIX + client.getClientId(), true).isEmpty());
}
@Test
public void registerClientInMasterRealm() throws Exception {
ClientRegistration masterReg = ClientRegistration.create().url(suiteContext.getAuthServerInfo().getContextRoot() + "/auth", "master").build();