Make update IdentityProvider admin REST API more efficient
Closes #32388 Signed-off-by: cgeorgilakis-grnet <cgeorgilakis@admin.grnet.gr>
This commit is contained in:
parent
0e1a7c6f8e
commit
e6b271895e
1 changed files with 6 additions and 34 deletions
|
@ -183,11 +183,9 @@ public class IdentityProviderResource {
|
|||
}
|
||||
|
||||
private void updateIdpFromRep(IdentityProviderRepresentation providerRep, RealmModel realm, KeycloakSession session) {
|
||||
String newProviderAlias = providerRep.getAlias();
|
||||
String oldProviderAlias = getAliasByInternalId(providerRep.getInternalId());
|
||||
|
||||
if (oldProviderAlias == null) {
|
||||
providerRep.setInternalId(getInternalIdByAlias(providerRep.getAlias()));
|
||||
if (!identityProviderModel.getInternalId().equals(providerRep.getInternalId())) {
|
||||
providerRep.setInternalId(identityProviderModel.getInternalId());
|
||||
}
|
||||
|
||||
IdentityProviderModel updated = RepresentationToModel.toModel(realm, providerRep, session);
|
||||
|
@ -200,7 +198,9 @@ public class IdentityProviderResource {
|
|||
// update in case of legacy hide on login attr was used.
|
||||
providerRep.setHideOnLogin(updated.isHideOnLogin());
|
||||
|
||||
if (oldProviderAlias != null && !oldProviderAlias.equals(newProviderAlias)) {
|
||||
String newProviderAlias = providerRep.getAlias();
|
||||
String oldProviderAlias = identityProviderModel.getAlias();
|
||||
if (!oldProviderAlias.equals(newProviderAlias)) {
|
||||
|
||||
// Admin changed the ID (alias) of identity provider. We must update all clients and users
|
||||
logger.debug("Changing providerId in all clients and linked users. oldProviderId=" + oldProviderAlias + ", newProviderId=" + newProviderAlias);
|
||||
|
@ -210,34 +210,6 @@ public class IdentityProviderResource {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the alias of the IDP whose internal ID matches the specified ID.
|
||||
*
|
||||
* @param providerInternalId the IDP's internal ID.
|
||||
* @return the provider's alias, if an IDP is located with the given ID; {@code null} otherwise.
|
||||
*/
|
||||
private String getAliasByInternalId(String providerInternalId) {
|
||||
IdentityProviderModel identityProviderModel = session.identityProviders().getById(providerInternalId);
|
||||
return identityProviderModel != null ? identityProviderModel.getAlias() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the internal ID of the IDP whose alias matches the specified alias.
|
||||
*
|
||||
* @param alias the IDP's alias.
|
||||
* @return the provider's internal ID.
|
||||
* @throws NotFoundException if an IDP with a matching alias is not found.
|
||||
*/
|
||||
private String getInternalIdByAlias(String alias) {
|
||||
if (alias != null) {
|
||||
IdentityProviderModel identityProviderModel = session.identityProviders().getByAlias(alias);
|
||||
if (identityProviderModel != null) {
|
||||
return identityProviderModel.getInternalId();
|
||||
}
|
||||
}
|
||||
throw new NotFoundException("Identity provider not found with alias: " + alias);
|
||||
}
|
||||
|
||||
private static void updateUsersAfterProviderAliasChange(Stream<UserModel> users, String oldProviderId, String newProviderId, RealmModel realm, KeycloakSession session) {
|
||||
users.forEach(user -> {
|
||||
FederatedIdentityModel federatedIdentity = session.users().getFederatedIdentity(realm, user, oldProviderId);
|
||||
|
|
Loading…
Reference in a new issue