Merge pull request #1123 from patriot1burke/master
broker mapper datamodel
This commit is contained in:
commit
63f8d92a8b
17 changed files with 789 additions and 9 deletions
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||
<changeSet author="bburke@redhat.com" id="1.2.0.RC1">
|
||||
<delete tableName="CLIENT_SESSION_ROLE"/>
|
||||
<delete tableName="CLIENT_SESSION_NOTE"/>
|
||||
<delete tableName="CLIENT_SESSION"/>
|
||||
<delete tableName="USER_SESSION"/>
|
||||
|
||||
<createTable tableName="IDENTITY_PROVIDER_MAPPER">
|
||||
<column name="ID" type="VARCHAR(36)">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
<column name="NAME" type="VARCHAR(255)">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
<column name="IDP_ALIAS" type="VARCHAR(255)">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
<column name="IDP_MAPPER_NAME" type="VARCHAR(255)">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
<column name="REALM_ID" type="VARCHAR(36)">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
</createTable>
|
||||
<createTable tableName="IDP_MAPPER_CONFIG">
|
||||
<column name="IDP_MAPPER_ID" type="VARCHAR(36)">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
<column name="VALUE" type="CLOB"/>
|
||||
<column name="NAME" type="VARCHAR(255)">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
</createTable>
|
||||
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_IDPM" tableName="IDENTITY_PROVIDER_MAPPER"/>
|
||||
<addPrimaryKey columnNames="IDP_MAPPER_ID, NAME" constraintName="CONSTRAINT_IDPMConfig" tableName="IDP_MAPPER_CONFIG"/>
|
||||
<addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="IDENTITY_PROVIDER_MAPPER" constraintName="FK_IDPM_REALM" referencedColumnNames="ID" referencedTableName="REALM"/>
|
||||
<addForeignKeyConstraint baseColumnNames="IDP_MAPPER_ID" baseTableName="IDP_MAPPER_CONFIG" constraintName="FK_IDPMConfig" referencedColumnNames="ID" referencedTableName="IDENTITY_PROVIDER_MAPPER"/>
|
||||
</changeSet>
|
||||
</databaseChangeLog>
|
1
connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-master.xml
Normal file → Executable file
1
connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-master.xml
Normal file → Executable file
|
@ -4,4 +4,5 @@
|
|||
<include file="META-INF/jpa-changelog-1.1.0.Beta1.xml"/>
|
||||
<include file="META-INF/jpa-changelog-1.1.0.Final.xml"/>
|
||||
<include file="META-INF/jpa-changelog-1.2.0.Beta1.xml"/>
|
||||
<include file="META-INF/jpa-changelog-1.2.0.RC1.xml"/>
|
||||
</databaseChangeLog>
|
||||
|
|
|
@ -12,7 +12,7 @@ public interface JpaUpdaterProvider extends Provider {
|
|||
|
||||
public String FIRST_VERSION = "1.0.0.Final";
|
||||
|
||||
public String LAST_VERSION = "1.2.0.Beta1";
|
||||
public String LAST_VERSION = "1.2.0.RC1";
|
||||
|
||||
public String getCurrentVersionSql();
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
<class>org.keycloak.models.jpa.entities.UserRoleMappingEntity</class>
|
||||
<class>org.keycloak.models.jpa.entities.ScopeMappingEntity</class>
|
||||
<class>org.keycloak.models.jpa.entities.IdentityProviderEntity</class>
|
||||
<class>org.keycloak.models.jpa.entities.IdentityProviderMapperEntity</class>
|
||||
<class>org.keycloak.models.jpa.entities.ClientIdentityProviderMappingEntity</class>
|
||||
<class>org.keycloak.models.jpa.entities.ProtocolMapperEntity</class>
|
||||
|
||||
|
|
75
model/api/src/main/java/org/keycloak/models/IdentityProviderMapperModel.java
Executable file
75
model/api/src/main/java/org/keycloak/models/IdentityProviderMapperModel.java
Executable file
|
@ -0,0 +1,75 @@
|
|||
package org.keycloak.models;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Specifies a mapping from broker login to user data.
|
||||
*
|
||||
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
|
||||
* @version $Revision: 1 $
|
||||
*/
|
||||
public class IdentityProviderMapperModel {
|
||||
protected String id;
|
||||
protected String name;
|
||||
protected String identityProviderAlias;
|
||||
protected String identityProviderMapper;
|
||||
protected Map<String, String> config;
|
||||
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getIdentityProviderAlias() {
|
||||
return identityProviderAlias;
|
||||
}
|
||||
|
||||
public void setIdentityProviderAlias(String identityProviderAlias) {
|
||||
this.identityProviderAlias = identityProviderAlias;
|
||||
}
|
||||
|
||||
public String getIdentityProviderMapper() {
|
||||
return identityProviderMapper;
|
||||
}
|
||||
|
||||
public void setIdentityProviderMapper(String identityProviderMapper) {
|
||||
this.identityProviderMapper = identityProviderMapper;
|
||||
}
|
||||
|
||||
public Map<String, String> getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public void setConfig(Map<String, String> config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
IdentityProviderMapperModel that = (IdentityProviderMapperModel) o;
|
||||
|
||||
if (!id.equals(that.id)) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return id.hashCode();
|
||||
}
|
||||
}
|
|
@ -3,10 +3,7 @@ package org.keycloak.models;
|
|||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Specifies a mapping from user data to a protocol claim assertion. If protocolMapper is set, this points
|
||||
* to a @Provider that will perform the mapping. If you have this set, then no other attributes of this class need to be set.
|
||||
* If you don't have it set, then this is a simple one to one mapping between the protocolClaim and the sourceAttribute.
|
||||
* SourceAttribute is the user data, protocolClaim is the name of the data you want to store in the protocols document or token.
|
||||
* Specifies a mapping from user data to a protocol claim assertion.
|
||||
*
|
||||
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
|
||||
* @version $Revision: 1 $
|
||||
|
|
|
@ -189,6 +189,14 @@ public interface RealmModel extends RoleContainerModel {
|
|||
void addIdentityProvider(IdentityProviderModel identityProvider);
|
||||
void removeIdentityProviderByAlias(String alias);
|
||||
void updateIdentityProvider(IdentityProviderModel identityProvider);
|
||||
Set<IdentityProviderMapperModel> getIdentityProviderMappers();
|
||||
Set<IdentityProviderMapperModel> getIdentityProviderMappersByAlias(String brokerAlias);
|
||||
IdentityProviderMapperModel addIdentityProviderMapper(IdentityProviderMapperModel model);
|
||||
void removeIdentityProviderMapper(IdentityProviderMapperModel mapping);
|
||||
void updateIdentityProviderMapper(IdentityProviderMapperModel mapping);
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperById(String id);
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperByName(String brokerAlias, String name);
|
||||
|
||||
|
||||
List<UserFederationProviderModel> getUserFederationProviders();
|
||||
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
package org.keycloak.models.entities;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
|
||||
* @version $Revision: 1 $
|
||||
*/
|
||||
public class IdentityProviderMapperEntity {
|
||||
protected String id;
|
||||
protected String name;
|
||||
protected String identityProviderAlias;
|
||||
protected String identityProviderMapper;
|
||||
protected Map<String, String> config;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Map<String, String> getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public void setConfig(Map<String, String> config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
public String getIdentityProviderAlias() {
|
||||
return identityProviderAlias;
|
||||
}
|
||||
|
||||
public void setIdentityProviderAlias(String identityProviderAlias) {
|
||||
this.identityProviderAlias = identityProviderAlias;
|
||||
}
|
||||
|
||||
public String getIdentityProviderMapper() {
|
||||
return identityProviderMapper;
|
||||
}
|
||||
|
||||
public void setIdentityProviderMapper(String identityProviderMapper) {
|
||||
this.identityProviderMapper = identityProviderMapper;
|
||||
}
|
||||
}
|
|
@ -69,6 +69,8 @@ public class RealmEntity extends AbstractIdentifiableEntity {
|
|||
private boolean internationalizationEnabled;
|
||||
private List<String> supportedLocales = new ArrayList<String>();
|
||||
private String defaultLocale;
|
||||
private List<IdentityProviderMapperEntity> identityProviderMappers = new ArrayList<IdentityProviderMapperEntity>();
|
||||
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
|
@ -444,6 +446,14 @@ public class RealmEntity extends AbstractIdentifiableEntity {
|
|||
public void setDefaultLocale(String defaultLocale) {
|
||||
this.defaultLocale = defaultLocale;
|
||||
}
|
||||
|
||||
public List<IdentityProviderMapperEntity> getIdentityProviderMappers() {
|
||||
return identityProviderMappers;
|
||||
}
|
||||
|
||||
public void setIdentityProviderMappers(List<IdentityProviderMapperEntity> identityProviderMappers) {
|
||||
this.identityProviderMappers = identityProviderMappers;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.keycloak.models.file.adapter;
|
|||
import org.keycloak.enums.SslRequired;
|
||||
import org.keycloak.models.ApplicationModel;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.IdentityProviderMapperModel;
|
||||
import org.keycloak.models.IdentityProviderModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.OAuthClientModel;
|
||||
|
@ -27,6 +28,7 @@ import org.keycloak.models.RealmModel;
|
|||
import org.keycloak.models.RequiredCredentialModel;
|
||||
import org.keycloak.models.RoleModel;
|
||||
import org.keycloak.models.UserFederationProviderModel;
|
||||
import org.keycloak.models.entities.IdentityProviderMapperEntity;
|
||||
import org.keycloak.models.entities.RequiredCredentialEntity;
|
||||
import org.keycloak.models.entities.UserFederationProviderEntity;
|
||||
import org.keycloak.models.utils.KeycloakModelUtils;
|
||||
|
@ -1132,4 +1134,131 @@ public class RealmAdapter implements RealmModel {
|
|||
public int hashCode() {
|
||||
return getId().hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<IdentityProviderMapperModel> getIdentityProviderMappers() {
|
||||
Set<IdentityProviderMapperModel> mappings = new HashSet<>();
|
||||
for (IdentityProviderMapperEntity entity : this.realm.getIdentityProviderMappers()) {
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) {
|
||||
config.putAll(entity.getConfig());
|
||||
}
|
||||
mapping.setConfig(config);
|
||||
mappings.add(mapping);
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
@Override
|
||||
public Set<IdentityProviderMapperModel> getIdentityProviderMappersByAlias(String brokerAlias) {
|
||||
Set<IdentityProviderMapperModel> mappings = new HashSet<>();
|
||||
for (IdentityProviderMapperEntity entity : this.realm.getIdentityProviderMappers()) {
|
||||
if (!entity.getIdentityProviderAlias().equals(brokerAlias)) {
|
||||
continue;
|
||||
}
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) {
|
||||
config.putAll(entity.getConfig());
|
||||
}
|
||||
mapping.setConfig(config);
|
||||
mappings.add(mapping);
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel addIdentityProviderMapper(IdentityProviderMapperModel model) {
|
||||
if (getIdentityProviderMapperByName(model.getIdentityProviderAlias(), model.getIdentityProviderMapper()) != null) {
|
||||
throw new RuntimeException("protocol mapper name must be unique per protocol");
|
||||
}
|
||||
String id = KeycloakModelUtils.generateId();
|
||||
IdentityProviderMapperEntity entity = new IdentityProviderMapperEntity();
|
||||
entity.setId(id);
|
||||
entity.setName(model.getName());
|
||||
entity.setIdentityProviderAlias(model.getIdentityProviderAlias());
|
||||
entity.setIdentityProviderMapper(model.getIdentityProviderMapper());
|
||||
entity.setConfig(model.getConfig());
|
||||
|
||||
this.realm.getIdentityProviderMappers().add(entity);
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperEntity getIdentityProviderMapperEntity(String id) {
|
||||
for (IdentityProviderMapperEntity entity : this.realm.getIdentityProviderMappers()) {
|
||||
if (entity.getId().equals(id)) {
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperEntity getIdentityProviderMapperEntityByName(String alias, String name) {
|
||||
for (IdentityProviderMapperEntity entity : this.realm.getIdentityProviderMappers()) {
|
||||
if (entity.getIdentityProviderAlias().equals(alias) && entity.getName().equals(name)) {
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeIdentityProviderMapper(IdentityProviderMapperModel mapping) {
|
||||
IdentityProviderMapperEntity toDelete = getIdentityProviderMapperEntity(mapping.getId());
|
||||
if (toDelete != null) {
|
||||
this.realm.getIdentityProviderMappers().remove(toDelete);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateIdentityProviderMapper(IdentityProviderMapperModel mapping) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntity(mapping.getId());
|
||||
entity.setIdentityProviderAlias(mapping.getIdentityProviderAlias());
|
||||
entity.setIdentityProviderMapper(mapping.getIdentityProviderMapper());
|
||||
if (entity.getConfig() == null) {
|
||||
entity.setConfig(mapping.getConfig());
|
||||
} else {
|
||||
entity.getConfig().clear();
|
||||
entity.getConfig().putAll(mapping.getConfig());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperById(String id) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntity(id);
|
||||
if (entity == null) return null;
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperByName(String alias, String name) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntityByName(alias, name);
|
||||
if (entity == null) return null;
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperModel entityToModel(IdentityProviderMapperEntity entity) {
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) config.putAll(entity.getConfig());
|
||||
mapping.setConfig(config);
|
||||
return mapping;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import org.keycloak.enums.SslRequired;
|
|||
import org.keycloak.models.ApplicationModel;
|
||||
import org.keycloak.models.ClaimTypeModel;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.IdentityProviderMapperModel;
|
||||
import org.keycloak.models.IdentityProviderModel;
|
||||
import org.keycloak.models.OAuthClientModel;
|
||||
import org.keycloak.models.PasswordPolicy;
|
||||
|
@ -14,6 +15,7 @@ import org.keycloak.models.RequiredCredentialModel;
|
|||
import org.keycloak.models.RoleModel;
|
||||
import org.keycloak.models.UserFederationProviderModel;
|
||||
import org.keycloak.models.cache.entities.CachedRealm;
|
||||
import org.keycloak.models.entities.IdentityProviderMapperEntity;
|
||||
import org.keycloak.models.utils.KeycloakModelUtils;
|
||||
|
||||
import java.security.Key;
|
||||
|
@ -935,4 +937,67 @@ public class RealmAdapter implements RealmModel {
|
|||
public void setDefaultLocale(String locale) {
|
||||
updated.setDefaultLocale(locale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<IdentityProviderMapperModel> getIdentityProviderMappers() {
|
||||
if (updated != null) return updated.getIdentityProviderMappers();
|
||||
Set<IdentityProviderMapperModel> mappings = new HashSet<>();
|
||||
for (List<IdentityProviderMapperModel> models : cached.getIdentityProviderMappers().values()) {
|
||||
for (IdentityProviderMapperModel model : models) {
|
||||
mappings.add(model);
|
||||
}
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<IdentityProviderMapperModel> getIdentityProviderMappersByAlias(String brokerAlias) {
|
||||
if (updated != null) return updated.getIdentityProviderMappersByAlias(brokerAlias);
|
||||
Set<IdentityProviderMapperModel> mappings = new HashSet<>();
|
||||
List<IdentityProviderMapperModel> list = cached.getIdentityProviderMappers().getList(brokerAlias);
|
||||
for (IdentityProviderMapperModel entity : list) {
|
||||
mappings.add(entity);
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel addIdentityProviderMapper(IdentityProviderMapperModel model) {
|
||||
getDelegateForUpdate();
|
||||
return updated.addIdentityProviderMapper(model);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeIdentityProviderMapper(IdentityProviderMapperModel mapping) {
|
||||
getDelegateForUpdate();
|
||||
updated.removeIdentityProviderMapper(mapping);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateIdentityProviderMapper(IdentityProviderMapperModel mapping) {
|
||||
getDelegateForUpdate();
|
||||
updated.updateIdentityProviderMapper(mapping);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperById(String id) {
|
||||
if (updated != null) return updated.getIdentityProviderMapperById(id);
|
||||
for (List<IdentityProviderMapperModel> models : cached.getIdentityProviderMappers().values()) {
|
||||
for (IdentityProviderMapperModel model : models) {
|
||||
if (model.getId().equals(id)) return model;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperByName(String alias, String name) {
|
||||
if (updated != null) return updated.getIdentityProviderMapperByName(alias, name);
|
||||
List<IdentityProviderMapperModel> models = cached.getIdentityProviderMappers().getList(alias);
|
||||
if (models == null) return null;
|
||||
for (IdentityProviderMapperModel model : models) {
|
||||
if (model.getName().equals(name)) return model;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,17 +2,17 @@ package org.keycloak.models.cache.entities;
|
|||
|
||||
import org.keycloak.enums.SslRequired;
|
||||
import org.keycloak.models.ApplicationModel;
|
||||
import org.keycloak.models.ClaimTypeModel;
|
||||
import org.keycloak.models.IdentityProviderMapperModel;
|
||||
import org.keycloak.models.IdentityProviderModel;
|
||||
import org.keycloak.models.OAuthClientModel;
|
||||
import org.keycloak.models.PasswordPolicy;
|
||||
import org.keycloak.models.ProtocolMapperModel;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.RealmProvider;
|
||||
import org.keycloak.models.RequiredCredentialModel;
|
||||
import org.keycloak.models.RoleModel;
|
||||
import org.keycloak.models.UserFederationProviderModel;
|
||||
import org.keycloak.models.cache.RealmCache;
|
||||
import org.keycloak.util.MultivaluedHashMap;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
@ -87,6 +87,7 @@ public class CachedRealm {
|
|||
private boolean internationalizationEnabled;
|
||||
private Set<String> supportedLocales = new HashSet<String>();
|
||||
private String defaultLocale;
|
||||
private MultivaluedHashMap<String, IdentityProviderMapperModel> identityProviderMappers = new MultivaluedHashMap<>();
|
||||
|
||||
public CachedRealm() {
|
||||
}
|
||||
|
@ -135,12 +136,18 @@ public class CachedRealm {
|
|||
requiredCredentials = model.getRequiredCredentials();
|
||||
userFederationProviders = model.getUserFederationProviders();
|
||||
|
||||
this.identityProviders = new ArrayList<IdentityProviderModel>();
|
||||
this.identityProviders = new ArrayList<>();
|
||||
|
||||
for (IdentityProviderModel identityProviderModel : model.getIdentityProviders()) {
|
||||
this.identityProviders.add(new IdentityProviderModel(identityProviderModel));
|
||||
}
|
||||
|
||||
for (IdentityProviderMapperModel mapper : model.getIdentityProviderMappers()) {
|
||||
identityProviderMappers.add(mapper.getIdentityProviderAlias(), mapper);
|
||||
}
|
||||
|
||||
|
||||
|
||||
smtpConfig.putAll(model.getSmtpConfig());
|
||||
browserSecurityHeaders.putAll(model.getBrowserSecurityHeaders());
|
||||
|
||||
|
@ -378,4 +385,8 @@ public class CachedRealm {
|
|||
public String getDefaultLocale() {
|
||||
return defaultLocale;
|
||||
}
|
||||
|
||||
public MultivaluedHashMap<String, IdentityProviderMapperModel> getIdentityProviderMappers() {
|
||||
return identityProviderMappers;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,16 +3,19 @@ package org.keycloak.models.jpa;
|
|||
import org.keycloak.enums.SslRequired;
|
||||
import org.keycloak.models.ApplicationModel;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.IdentityProviderMapperModel;
|
||||
import org.keycloak.models.IdentityProviderModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.OAuthClientModel;
|
||||
import org.keycloak.models.PasswordPolicy;
|
||||
import org.keycloak.models.ProtocolMapperModel;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.RequiredCredentialModel;
|
||||
import org.keycloak.models.RoleModel;
|
||||
import org.keycloak.models.UserFederationProviderModel;
|
||||
import org.keycloak.models.jpa.entities.ApplicationEntity;
|
||||
import org.keycloak.models.jpa.entities.IdentityProviderEntity;
|
||||
import org.keycloak.models.jpa.entities.IdentityProviderMapperEntity;
|
||||
import org.keycloak.models.jpa.entities.OAuthClientEntity;
|
||||
import org.keycloak.models.jpa.entities.RealmAttributeEntity;
|
||||
import org.keycloak.models.jpa.entities.RealmEntity;
|
||||
|
@ -1278,4 +1281,135 @@ public class RealmAdapter implements RealmModel {
|
|||
realm.setDefaultLocale(locale);
|
||||
em.flush();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<IdentityProviderMapperModel> getIdentityProviderMappers() {
|
||||
Set<IdentityProviderMapperModel> mappings = new HashSet<IdentityProviderMapperModel>();
|
||||
for (IdentityProviderMapperEntity entity : this.realm.getIdentityProviderMappers()) {
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) {
|
||||
config.putAll(entity.getConfig());
|
||||
}
|
||||
mapping.setConfig(config);
|
||||
mappings.add(mapping);
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<IdentityProviderMapperModel> getIdentityProviderMappersByAlias(String brokerAlias) {
|
||||
Set<IdentityProviderMapperModel> mappings = new HashSet<IdentityProviderMapperModel>();
|
||||
for (IdentityProviderMapperEntity entity : this.realm.getIdentityProviderMappers()) {
|
||||
if (!entity.getIdentityProviderAlias().equals(brokerAlias)) {
|
||||
continue;
|
||||
}
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) {
|
||||
config.putAll(entity.getConfig());
|
||||
}
|
||||
mapping.setConfig(config);
|
||||
mappings.add(mapping);
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel addIdentityProviderMapper(IdentityProviderMapperModel model) {
|
||||
if (getIdentityProviderMapperByName(model.getIdentityProviderAlias(), model.getIdentityProviderMapper()) != null) {
|
||||
throw new RuntimeException("protocol mapper name must be unique per protocol");
|
||||
}
|
||||
String id = KeycloakModelUtils.generateId();
|
||||
IdentityProviderMapperEntity entity = new IdentityProviderMapperEntity();
|
||||
entity.setId(id);
|
||||
entity.setName(model.getName());
|
||||
entity.setIdentityProviderAlias(model.getIdentityProviderAlias());
|
||||
entity.setIdentityProviderMapper(model.getIdentityProviderMapper());
|
||||
entity.setRealm(this.realm);
|
||||
entity.setConfig(model.getConfig());
|
||||
|
||||
em.persist(entity);
|
||||
this.realm.getIdentityProviderMappers().add(entity);
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperEntity getIdentityProviderMapperEntity(String id) {
|
||||
for (IdentityProviderMapperEntity entity : this.realm.getIdentityProviderMappers()) {
|
||||
if (entity.getId().equals(id)) {
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperEntity getIdentityProviderMapperEntityByName(String alias, String name) {
|
||||
for (IdentityProviderMapperEntity entity : this.realm.getIdentityProviderMappers()) {
|
||||
if (entity.getIdentityProviderAlias().equals(alias) && entity.getName().equals(name)) {
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeIdentityProviderMapper(IdentityProviderMapperModel mapping) {
|
||||
IdentityProviderMapperEntity toDelete = getIdentityProviderMapperEntity(mapping.getId());
|
||||
if (toDelete != null) {
|
||||
this.realm.getIdentityProviderMappers().remove(toDelete);
|
||||
em.remove(toDelete);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateIdentityProviderMapper(IdentityProviderMapperModel mapping) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntity(mapping.getId());
|
||||
entity.setIdentityProviderAlias(mapping.getIdentityProviderAlias());
|
||||
entity.setIdentityProviderMapper(mapping.getIdentityProviderMapper());
|
||||
if (entity.getConfig() == null) {
|
||||
entity.setConfig(mapping.getConfig());
|
||||
} else {
|
||||
entity.getConfig().clear();
|
||||
entity.getConfig().putAll(mapping.getConfig());
|
||||
}
|
||||
em.flush();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperById(String id) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntity(id);
|
||||
if (entity == null) return null;
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperByName(String alias, String name) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntityByName(alias, name);
|
||||
if (entity == null) return null;
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperModel entityToModel(IdentityProviderMapperEntity entity) {
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) config.putAll(entity.getConfig());
|
||||
mapping.setConfig(config);
|
||||
return mapping;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
package org.keycloak.models.jpa.entities;
|
||||
|
||||
import javax.persistence.CollectionTable;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.ElementCollection;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.MapKeyColumn;
|
||||
import javax.persistence.Table;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
|
||||
* @version $Revision: 1 $
|
||||
*/
|
||||
@Entity
|
||||
@Table(name="IDENTITY_PROVIDER_MAPPER")
|
||||
public class IdentityProviderMapperEntity {
|
||||
|
||||
@Id
|
||||
@Column(name="ID", length = 36)
|
||||
protected String id;
|
||||
|
||||
@Column(name="NAME")
|
||||
protected String name;
|
||||
|
||||
@Column(name = "IDP_ALIAS")
|
||||
protected String identityProviderAlias;
|
||||
@Column(name = "IDP_MAPPER_NAME")
|
||||
protected String identityProviderMapper;
|
||||
|
||||
@ElementCollection
|
||||
@MapKeyColumn(name="name")
|
||||
@Column(name="value")
|
||||
@CollectionTable(name="IDP_MAPPER_CONFIG", joinColumns={ @JoinColumn(name="IDP_MAPPER_ID") })
|
||||
private Map<String, String> config;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "REALM_ID")
|
||||
private RealmEntity realm;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getIdentityProviderAlias() {
|
||||
return identityProviderAlias;
|
||||
}
|
||||
|
||||
public void setIdentityProviderAlias(String identityProviderAlias) {
|
||||
this.identityProviderAlias = identityProviderAlias;
|
||||
}
|
||||
|
||||
public String getIdentityProviderMapper() {
|
||||
return identityProviderMapper;
|
||||
}
|
||||
|
||||
public void setIdentityProviderMapper(String identityProviderMapper) {
|
||||
this.identityProviderMapper = identityProviderMapper;
|
||||
}
|
||||
|
||||
public RealmEntity getRealm() {
|
||||
return realm;
|
||||
}
|
||||
|
||||
public void setRealm(RealmEntity realm) {
|
||||
this.realm = realm;
|
||||
}
|
||||
|
||||
public Map<String, String> getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public void setConfig(Map<String, String> config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
IdentityProviderMapperEntity that = (IdentityProviderMapperEntity) o;
|
||||
|
||||
if (!id.equals(that.id)) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return id.hashCode();
|
||||
}
|
||||
}
|
|
@ -142,6 +142,11 @@ public class RealmEntity {
|
|||
@OneToMany(cascade ={CascadeType.REMOVE}, orphanRemoval = true, mappedBy = "realm")
|
||||
protected List<IdentityProviderEntity> identityProviders = new ArrayList<IdentityProviderEntity>();
|
||||
|
||||
@OneToMany(cascade ={CascadeType.REMOVE}, orphanRemoval = true, mappedBy = "realm")
|
||||
Collection<IdentityProviderMapperEntity> identityProviderMappers = new ArrayList<IdentityProviderMapperEntity>();
|
||||
|
||||
|
||||
|
||||
@Column(name="INTERNATIONALIZATION_ENABLED")
|
||||
protected boolean internationalizationEnabled;
|
||||
|
||||
|
@ -500,5 +505,13 @@ public class RealmEntity {
|
|||
public void setDefaultLocale(String defaultLocale) {
|
||||
this.defaultLocale = defaultLocale;
|
||||
}
|
||||
|
||||
public Collection<IdentityProviderMapperEntity> getIdentityProviderMappers() {
|
||||
return identityProviderMappers;
|
||||
}
|
||||
|
||||
public void setIdentityProviderMappers(Collection<IdentityProviderMapperEntity> identityProviderMappers) {
|
||||
this.identityProviderMappers = identityProviderMappers;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
|
|||
import org.keycloak.enums.SslRequired;
|
||||
import org.keycloak.models.ApplicationModel;
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.IdentityProviderMapperModel;
|
||||
import org.keycloak.models.IdentityProviderModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.OAuthClientModel;
|
||||
|
@ -16,6 +17,7 @@ import org.keycloak.models.RequiredCredentialModel;
|
|||
import org.keycloak.models.RoleModel;
|
||||
import org.keycloak.models.UserFederationProviderModel;
|
||||
import org.keycloak.models.entities.IdentityProviderEntity;
|
||||
import org.keycloak.models.entities.IdentityProviderMapperEntity;
|
||||
import org.keycloak.models.entities.RequiredCredentialEntity;
|
||||
import org.keycloak.models.entities.UserFederationProviderEntity;
|
||||
import org.keycloak.models.mongo.keycloak.entities.MongoApplicationEntity;
|
||||
|
@ -1133,4 +1135,134 @@ public class RealmAdapter extends AbstractMongoAdapter<MongoRealmEntity> impleme
|
|||
realm.setDefaultLocale(locale);
|
||||
updateRealm();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<IdentityProviderMapperModel> getIdentityProviderMappers() {
|
||||
Set<IdentityProviderMapperModel> mappings = new HashSet<IdentityProviderMapperModel>();
|
||||
for (IdentityProviderMapperEntity entity : getMongoEntity().getIdentityProviderMappers()) {
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) {
|
||||
config.putAll(entity.getConfig());
|
||||
}
|
||||
mapping.setConfig(config);
|
||||
mappings.add(mapping);
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<IdentityProviderMapperModel> getIdentityProviderMappersByAlias(String brokerAlias) {
|
||||
Set<IdentityProviderMapperModel> mappings = new HashSet<IdentityProviderMapperModel>();
|
||||
for (IdentityProviderMapperEntity entity : getMongoEntity().getIdentityProviderMappers()) {
|
||||
if (!entity.getIdentityProviderAlias().equals(brokerAlias)) {
|
||||
continue;
|
||||
}
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) {
|
||||
config.putAll(entity.getConfig());
|
||||
}
|
||||
mapping.setConfig(config);
|
||||
mappings.add(mapping);
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel addIdentityProviderMapper(IdentityProviderMapperModel model) {
|
||||
if (getIdentityProviderMapperByName(model.getIdentityProviderAlias(), model.getIdentityProviderMapper()) != null) {
|
||||
throw new RuntimeException("protocol mapper name must be unique per protocol");
|
||||
}
|
||||
String id = KeycloakModelUtils.generateId();
|
||||
IdentityProviderMapperEntity entity = new IdentityProviderMapperEntity();
|
||||
entity.setId(id);
|
||||
entity.setName(model.getName());
|
||||
entity.setIdentityProviderAlias(model.getIdentityProviderAlias());
|
||||
entity.setIdentityProviderMapper(model.getIdentityProviderMapper());
|
||||
entity.setConfig(model.getConfig());
|
||||
|
||||
getMongoEntity().getIdentityProviderMappers().add(entity);
|
||||
updateMongoEntity();
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperEntity getIdentityProviderMapperEntity(String id) {
|
||||
for (IdentityProviderMapperEntity entity : getMongoEntity().getIdentityProviderMappers()) {
|
||||
if (entity.getId().equals(id)) {
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperEntity getIdentityProviderMapperEntityByName(String alias, String name) {
|
||||
for (IdentityProviderMapperEntity entity : getMongoEntity().getIdentityProviderMappers()) {
|
||||
if (entity.getIdentityProviderAlias().equals(alias) && entity.getName().equals(name)) {
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeIdentityProviderMapper(IdentityProviderMapperModel mapping) {
|
||||
IdentityProviderMapperEntity toDelete = getIdentityProviderMapperEntity(mapping.getId());
|
||||
if (toDelete != null) {
|
||||
this.realm.getIdentityProviderMappers().remove(toDelete);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateIdentityProviderMapper(IdentityProviderMapperModel mapping) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntity(mapping.getId());
|
||||
entity.setIdentityProviderAlias(mapping.getIdentityProviderAlias());
|
||||
entity.setIdentityProviderMapper(mapping.getIdentityProviderMapper());
|
||||
if (entity.getConfig() == null) {
|
||||
entity.setConfig(mapping.getConfig());
|
||||
} else {
|
||||
entity.getConfig().clear();
|
||||
entity.getConfig().putAll(mapping.getConfig());
|
||||
}
|
||||
updateMongoEntity();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperById(String id) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntity(id);
|
||||
if (entity == null) return null;
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IdentityProviderMapperModel getIdentityProviderMapperByName(String alias, String name) {
|
||||
IdentityProviderMapperEntity entity = getIdentityProviderMapperEntityByName(alias, name);
|
||||
if (entity == null) return null;
|
||||
return entityToModel(entity);
|
||||
}
|
||||
|
||||
protected IdentityProviderMapperModel entityToModel(IdentityProviderMapperEntity entity) {
|
||||
IdentityProviderMapperModel mapping = new IdentityProviderMapperModel();
|
||||
mapping.setId(entity.getId());
|
||||
mapping.setName(entity.getName());
|
||||
mapping.setIdentityProviderAlias(entity.getIdentityProviderAlias());
|
||||
mapping.setIdentityProviderMapper(entity.getIdentityProviderMapper());
|
||||
Map<String, String> config = new HashMap<String, String>();
|
||||
if (entity.getConfig() != null) config.putAll(entity.getConfig());
|
||||
mapping.setConfig(config);
|
||||
return mapping;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -157,7 +157,7 @@ public class AccountTest {
|
|||
});
|
||||
}
|
||||
|
||||
@Test @Ignore
|
||||
//@Test @Ignore
|
||||
public void runit() throws Exception {
|
||||
Thread.sleep(10000000);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue