Update federated links when identity provider alias is changed
This commit is contained in:
parent
8c4f45fd38
commit
24f18609dd
2 changed files with 25 additions and 20 deletions
|
@ -230,26 +230,12 @@ public class MongoUserProvider implements UserProvider {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private FederatedIdentityEntity findSocialLink(UserModel userModel, String socialProvider, RealmModel realm) {
|
|
||||||
UserModel user = getUserById(userModel.getId(), realm);
|
|
||||||
MongoUserEntity userEntity = ((UserAdapter) user).getUser();
|
|
||||||
List<FederatedIdentityEntity> linkEntities = userEntity.getFederatedIdentities();
|
|
||||||
if (linkEntities == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (FederatedIdentityEntity federatedIdentityEntity : linkEntities) {
|
|
||||||
if (federatedIdentityEntity.getIdentityProvider().equals(socialProvider)) {
|
|
||||||
return federatedIdentityEntity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FederatedIdentityModel getFederatedIdentity(UserModel user, String socialProvider, RealmModel realm) {
|
public FederatedIdentityModel getFederatedIdentity(UserModel user, String socialProvider, RealmModel realm) {
|
||||||
FederatedIdentityEntity federatedIdentityEntity = findSocialLink(user, socialProvider, realm);
|
user = getUserById(user.getId(), realm);
|
||||||
|
MongoUserEntity userEntity = ((UserAdapter) user).getUser();
|
||||||
|
FederatedIdentityEntity federatedIdentityEntity = findFederatedIdentityLink(userEntity, socialProvider);
|
||||||
|
|
||||||
return federatedIdentityEntity != null ? new FederatedIdentityModel(federatedIdentityEntity.getIdentityProvider(), federatedIdentityEntity.getUserId(),
|
return federatedIdentityEntity != null ? new FederatedIdentityModel(federatedIdentityEntity.getIdentityProvider(), federatedIdentityEntity.getUserId(),
|
||||||
federatedIdentityEntity.getUserName(), federatedIdentityEntity.getToken()) : null;
|
federatedIdentityEntity.getUserName(), federatedIdentityEntity.getToken()) : null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,12 @@ import org.keycloak.broker.provider.IdentityProvider;
|
||||||
import org.keycloak.broker.provider.IdentityProviderFactory;
|
import org.keycloak.broker.provider.IdentityProviderFactory;
|
||||||
import org.keycloak.models.ClientIdentityProviderMappingModel;
|
import org.keycloak.models.ClientIdentityProviderMappingModel;
|
||||||
import org.keycloak.models.ClientModel;
|
import org.keycloak.models.ClientModel;
|
||||||
|
import org.keycloak.models.FederatedIdentityModel;
|
||||||
import org.keycloak.models.IdentityProviderModel;
|
import org.keycloak.models.IdentityProviderModel;
|
||||||
import org.keycloak.models.KeycloakSession;
|
import org.keycloak.models.KeycloakSession;
|
||||||
import org.keycloak.models.ModelDuplicateException;
|
import org.keycloak.models.ModelDuplicateException;
|
||||||
import org.keycloak.models.RealmModel;
|
import org.keycloak.models.RealmModel;
|
||||||
|
import org.keycloak.models.UserModel;
|
||||||
import org.keycloak.models.utils.ModelToRepresentation;
|
import org.keycloak.models.utils.ModelToRepresentation;
|
||||||
import org.keycloak.models.utils.RepresentationToModel;
|
import org.keycloak.models.utils.RepresentationToModel;
|
||||||
import org.keycloak.provider.ProviderFactory;
|
import org.keycloak.provider.ProviderFactory;
|
||||||
|
@ -80,11 +82,12 @@ public class IdentityProviderResource {
|
||||||
|
|
||||||
if (oldProviderId != null && !oldProviderId.equals(newProviderId)) {
|
if (oldProviderId != null && !oldProviderId.equals(newProviderId)) {
|
||||||
|
|
||||||
// User changed the ID (alias) of identity provider. We must update all clients
|
// Admin changed the ID (alias) of identity provider. We must update all clients and users
|
||||||
logger.info("Changing identityProviderMapping in all clients. oldProviderId=" + oldProviderId + ", newProviderId=" + newProviderId);
|
logger.debug("Changing providerId in all clients and linked users. oldProviderId=" + oldProviderId + ", newProviderId=" + newProviderId);
|
||||||
|
|
||||||
updateClientsAfterProviderAliasChange(this.realm.getApplications(), oldProviderId, newProviderId);
|
updateClientsAfterProviderAliasChange(this.realm.getApplications(), oldProviderId, newProviderId);
|
||||||
updateClientsAfterProviderAliasChange(this.realm.getOAuthClients(), oldProviderId, newProviderId);
|
updateClientsAfterProviderAliasChange(this.realm.getOAuthClients(), oldProviderId, newProviderId);
|
||||||
|
updateUsersAfterProviderAliasChange(this.session.users().getUsers(this.realm), oldProviderId, newProviderId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Response.noContent().build();
|
return Response.noContent().build();
|
||||||
|
@ -124,6 +127,22 @@ public class IdentityProviderResource {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateUsersAfterProviderAliasChange(List<UserModel> users, String oldProviderId, String newProviderId) {
|
||||||
|
for (UserModel user : users) {
|
||||||
|
FederatedIdentityModel federatedIdentity = this.session.users().getFederatedIdentity(user, oldProviderId, this.realm);
|
||||||
|
if (federatedIdentity != null) {
|
||||||
|
// Remove old link first
|
||||||
|
this.session.users().removeFederatedIdentity(this.realm, user, oldProviderId);
|
||||||
|
|
||||||
|
// And create new
|
||||||
|
FederatedIdentityModel newFederatedIdentity = new FederatedIdentityModel(newProviderId, federatedIdentity.getUserId(), federatedIdentity.getUserName(),
|
||||||
|
federatedIdentity.getToken());
|
||||||
|
this.session.users().addFederatedIdentity(this.realm, user, newFederatedIdentity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private IdentityProviderFactory getIdentityProviderFactory() {
|
private IdentityProviderFactory getIdentityProviderFactory() {
|
||||||
List<ProviderFactory> allProviders = new ArrayList<ProviderFactory>();
|
List<ProviderFactory> allProviders = new ArrayList<ProviderFactory>();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue