diff --git a/federation/ldap/src/main/java/org/keycloak/storage/ldap/mappers/UserAttributeLDAPStorageMapper.java b/federation/ldap/src/main/java/org/keycloak/storage/ldap/mappers/UserAttributeLDAPStorageMapper.java index 3e5b7f66309..db5ed92d11a 100644 --- a/federation/ldap/src/main/java/org/keycloak/storage/ldap/mappers/UserAttributeLDAPStorageMapper.java +++ b/federation/ldap/src/main/java/org/keycloak/storage/ldap/mappers/UserAttributeLDAPStorageMapper.java @@ -213,8 +213,11 @@ public class UserAttributeLDAPStorageMapper extends AbstractLDAPStorageMapper { @Override public void removeAttribute(String name) { - if (setLDAPAttribute(name, null)) { - super.removeAttribute(name); + if(!UserModel.USERNAME.equals(name)){ + //do not remove username + if (setLDAPAttribute(name, null)) { + super.removeAttribute(name); + } } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/ldap/LDAPAccountRestApiTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/ldap/LDAPAccountRestApiTest.java index 39097631fac..f1badb1c41a 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/ldap/LDAPAccountRestApiTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/federation/ldap/LDAPAccountRestApiTest.java @@ -118,6 +118,32 @@ public class LDAPAccountRestApiTest extends AbstractLDAPTest { Assert.assertNull(userPassword.getSecretData()); } + + @Test + public void testUpdateProfile() throws IOException { + testingClient.server().run(session -> { + LDAPTestContext ctx = LDAPTestContext.init(session); + RealmModel appRealm = ctx.getRealm(); + appRealm.setEditUsernameAllowed(false); + }); + UserRepresentation user = SimpleHttp.doGet(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).asJson(UserRepresentation.class); + user.setEmail("john-alias@email.org"); + SimpleHttp.doPost(getAccountUrl(null), httpClient).json(user).auth(tokenUtil.getToken()).asStatus(); + + UserRepresentation usernew = SimpleHttp.doGet(getAccountUrl(null), httpClient).auth(tokenUtil.getToken()).asJson(UserRepresentation.class); + assertEquals("johnkeycloak", usernew.getUsername()); + assertEquals("John", usernew.getFirstName()); + assertEquals("Doe", usernew.getLastName()); + assertEquals("john-alias@email.org", usernew.getEmail()); + assertFalse(usernew.isEmailVerified()); + + //clean up + usernew.setEmail("john@email.org"); + SimpleHttp.doPost(getAccountUrl(null), httpClient).json(usernew).auth(tokenUtil.getToken()).asStatus(); + + } + + private String getAccountUrl(String resource) { return suiteContext.getAuthServerInfo().getContextRoot().toString() + "/auth/realms/test/account" + (resource != null ? "/" + resource : ""); }