KEYCLOAK-1549 Migration for attributes and LDAP mappers - JPA
This commit is contained in:
parent
95c8603b69
commit
94ed55ee35
5 changed files with 73 additions and 10 deletions
|
@ -0,0 +1,54 @@
|
|||
package org.keycloak.connections.jpa.updater.liquibase.custom;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
|
||||
import liquibase.datatype.DataTypeFactory;
|
||||
import liquibase.exception.CustomChangeException;
|
||||
import liquibase.statement.core.InsertStatement;
|
||||
import liquibase.statement.core.UpdateStatement;
|
||||
import liquibase.structure.core.Table;
|
||||
import org.keycloak.models.utils.KeycloakModelUtils;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
|
||||
*/
|
||||
public class JpaUpdate1_4_0_Final extends CustomKeycloakTask {
|
||||
|
||||
@Override
|
||||
protected void generateStatementsImpl() throws CustomChangeException {
|
||||
String userAttributeTableName = database.correctObjectName("USER_ATTRIBUTE", Table.class);
|
||||
|
||||
try {
|
||||
PreparedStatement statement = jdbcConnection.prepareStatement("select NAME, USER_ID from USER_ATTRIBUTE");
|
||||
|
||||
try {
|
||||
ResultSet resultSet = statement.executeQuery();
|
||||
try {
|
||||
while (resultSet.next()) {
|
||||
String name = resultSet.getString(1);
|
||||
String userId = resultSet.getString(2);
|
||||
|
||||
UpdateStatement updateStatement = new UpdateStatement(null, null, userAttributeTableName)
|
||||
.addNewColumnValue("ID", KeycloakModelUtils.generateId())
|
||||
.setWhereClause("NAME='" + name + "' AND USER_ID='" + userId + "'");
|
||||
statements.add(updateStatement);
|
||||
}
|
||||
} finally {
|
||||
resultSet.close();
|
||||
}
|
||||
} finally {
|
||||
statement.close();
|
||||
}
|
||||
|
||||
confirmationMessage.append("Updated " + statements.size() + " attributes in USER_ATTRIBUTE table");
|
||||
} catch (Exception e) {
|
||||
throw new CustomChangeException(getTaskId() + ": Exception when updating data from previous version", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTaskId() {
|
||||
return "Update 1.4.0.Final";
|
||||
}
|
||||
}
|
|
@ -156,9 +156,9 @@
|
|||
|
||||
<!-- Remove obsolete 'social' and 'claims' stuff -->
|
||||
<dropForeignKeyConstraint baseTableName="USER_SOCIAL_LINK" constraintName="FK_68CJYS5UWM55UY823Y75XG4OM" />
|
||||
<dropTable tableName="USER_SOCIAL_LINK" />
|
||||
<dropTable tableName="USER_SOCIAL_LINK" cascadeConstraints="true" />
|
||||
<dropForeignKeyConstraint baseTableName="REALM_SOCIAL_CONFIG" constraintName="FK_SV5I3C2TI7G0G922FGE683SOV" />
|
||||
<dropTable tableName="REALM_SOCIAL_CONFIG" />
|
||||
<dropTable tableName="REALM_SOCIAL_CONFIG" cascadeConstraints="true" />
|
||||
<dropColumn tableName="CLIENT" columnName="ALLOWED_CLAIMS_MASK" />
|
||||
|
||||
<createTable tableName="REALM_ENABLED_EVENT_TYPES">
|
||||
|
|
|
@ -132,6 +132,8 @@
|
|||
</column>
|
||||
</createTable>
|
||||
|
||||
<customChange class="org.keycloak.connections.jpa.updater.liquibase.custom.JpaUpdate1_4_0_Final"/>
|
||||
|
||||
<dropPrimaryKey constraintName="CONSTRAINT_6" tableName="USER_ATTRIBUTE"/>
|
||||
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_USER_ATTRIBUTE_PK" tableName="USER_ATTRIBUTE"/>
|
||||
<addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_REQ_ACT_PRV_PK" tableName="REQUIRED_ACTION_PROVIDER"/>
|
||||
|
|
|
@ -49,13 +49,6 @@
|
|||
<kc-provider-config config="mapper.config" properties="mapperType.properties" realm="realm" clients="clients"></kc-provider-config>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-md-10 col-md-offset-2" data-ng-show="!create && access.manageRealm">
|
||||
<button kc-save>Save</button>
|
||||
<button kc-cancel data-ng-click="cancel()">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-md-10 col-md-offset-2" data-ng-show="!create && access.manageRealm">
|
||||
<button kc-save data-ng-show="changed">Save</button>
|
||||
|
|
|
@ -4,11 +4,13 @@ import org.keycloak.migration.ModelVersion;
|
|||
import org.keycloak.models.ImpersonationConstants;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.UserFederationMapperModel;
|
||||
import org.keycloak.models.UserModel;
|
||||
import org.keycloak.models.utils.DefaultAuthenticationFlows;
|
||||
import org.keycloak.models.utils.DefaultRequiredActions;
|
||||
import org.keycloak.models.utils.KeycloakModelUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
@ -26,12 +28,24 @@ public class MigrateTo1_4_0 {
|
|||
DefaultRequiredActions.addActions(realm);
|
||||
}
|
||||
ImpersonationConstants.setupImpersonationService(session, realm);
|
||||
|
||||
migrateLDAPMappers(session, realm);
|
||||
migrateUsers(session, realm);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void migrateUsers(KeycloakSession session, RealmModel realm) {
|
||||
private void migrateLDAPMappers(KeycloakSession session, RealmModel realm) {
|
||||
List<String> mandatoryInLdap = Arrays.asList("username", "username-cn", "first name", "last name");
|
||||
for (UserFederationMapperModel ldapMapper : realm.getUserFederationMappers()) {
|
||||
if (mandatoryInLdap.contains(ldapMapper.getName())) {
|
||||
ldapMapper.getConfig().put("is.mandatory.in.ldap", "true");
|
||||
realm.updateUserFederationMapper(ldapMapper);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void migrateUsers(KeycloakSession session, RealmModel realm) {
|
||||
List<UserModel> users = session.userStorage().getUsers(realm, false);
|
||||
for (UserModel user : users) {
|
||||
String email = user.getEmail();
|
||||
|
|
Loading…
Reference in a new issue