KEYCLOAK-1369 GUI order attribute of Social providers is reflected in
Account management app
This commit is contained in:
parent
6d6e598ce5
commit
087dab6f3d
1 changed files with 52 additions and 5 deletions
|
@ -9,13 +9,17 @@ import org.keycloak.services.resources.AccountService;
|
|||
import org.keycloak.services.Urls;
|
||||
|
||||
import javax.ws.rs.core.UriBuilder;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
|
||||
* @author <a href="mailto:velias@redhat.com">Vlastimil Elias</a>
|
||||
*/
|
||||
public class AccountFederatedIdentityBean {
|
||||
|
||||
|
@ -26,11 +30,11 @@ public class AccountFederatedIdentityBean {
|
|||
public AccountFederatedIdentityBean(KeycloakSession session, RealmModel realm, UserModel user, URI baseUri, String stateChecker) {
|
||||
this.session = session;
|
||||
URI accountIdentityUpdateUri = Urls.accountFederatedIdentityUpdate(baseUri, realm.getName());
|
||||
this.identities = new LinkedList<FederatedIdentityEntry>();
|
||||
|
||||
List<IdentityProviderModel> identityProviders = realm.getIdentityProviders();
|
||||
Set<FederatedIdentityModel> identities = session.users().getFederatedIdentities(user, realm);
|
||||
|
||||
Set<FederatedIdentityEntry> orderedSet = new TreeSet<>(IdentityProviderComparator.INSTANCE);
|
||||
int availableIdentities = 0;
|
||||
if (identityProviders != null && !identityProviders.isEmpty()) {
|
||||
for (IdentityProviderModel provider : identityProviders) {
|
||||
|
@ -49,10 +53,13 @@ public class AccountFederatedIdentityBean {
|
|||
.queryParam("stateChecker", stateChecker)
|
||||
.build().toString();
|
||||
|
||||
FederatedIdentityEntry entry = new FederatedIdentityEntry(identity, provider.getAlias(), provider.getAlias(), actionUrl);
|
||||
this.identities.add(entry);
|
||||
FederatedIdentityEntry entry = new FederatedIdentityEntry(identity, provider.getAlias(), provider.getAlias(), actionUrl,
|
||||
provider.getConfig() != null ? provider.getConfig().get("guiOrder") : null);
|
||||
orderedSet.add(entry);
|
||||
}
|
||||
}
|
||||
|
||||
this.identities = new LinkedList<FederatedIdentityEntry>(orderedSet);
|
||||
|
||||
// Removing last social provider is not possible if you don't have other possibility to authenticate
|
||||
this.removeLinkPossible = availableIdentities > 1 || user.getFederationLink() != null || AccountService.isPasswordSet(user);
|
||||
|
@ -81,13 +88,15 @@ public class AccountFederatedIdentityBean {
|
|||
private final String providerId;
|
||||
private final String providerName;
|
||||
private final String actionUrl;
|
||||
private final String guiOrder;
|
||||
|
||||
public FederatedIdentityEntry(FederatedIdentityModel federatedIdentityModel, String providerId, String providerName, String actionUrl
|
||||
public FederatedIdentityEntry(FederatedIdentityModel federatedIdentityModel, String providerId, String providerName, String actionUrl, String guiOrder
|
||||
) {
|
||||
this.federatedIdentityModel = federatedIdentityModel;
|
||||
this.providerId = providerId;
|
||||
this.providerName = providerName;
|
||||
this.actionUrl = actionUrl;
|
||||
this.guiOrder = guiOrder;
|
||||
}
|
||||
|
||||
public String getProviderId() {
|
||||
|
@ -113,5 +122,43 @@ public class AccountFederatedIdentityBean {
|
|||
public String getActionUrl() {
|
||||
return actionUrl;
|
||||
}
|
||||
|
||||
public String getGuiOrder() {
|
||||
return guiOrder;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class IdentityProviderComparator implements Comparator<FederatedIdentityEntry> {
|
||||
|
||||
public static IdentityProviderComparator INSTANCE = new IdentityProviderComparator();
|
||||
|
||||
private IdentityProviderComparator() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(FederatedIdentityEntry o1, FederatedIdentityEntry o2) {
|
||||
|
||||
int o1order = parseOrder(o1);
|
||||
int o2order = parseOrder(o2);
|
||||
|
||||
if (o1order > o2order)
|
||||
return 1;
|
||||
else if (o1order < o2order)
|
||||
return -1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
private int parseOrder(FederatedIdentityEntry ip) {
|
||||
if (ip != null && ip.getGuiOrder() != null) {
|
||||
try {
|
||||
return Integer.parseInt(ip.getGuiOrder());
|
||||
} catch (NumberFormatException e) {
|
||||
// ignore it and use defaulr
|
||||
}
|
||||
}
|
||||
return 10000;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue