Details
diff --git a/services/src/main/java/org/keycloak/forms/account/freemarker/model/RealmBean.java b/services/src/main/java/org/keycloak/forms/account/freemarker/model/RealmBean.java
index 569a769..d818876 100755
--- a/services/src/main/java/org/keycloak/forms/account/freemarker/model/RealmBean.java
+++ b/services/src/main/java/org/keycloak/forms/account/freemarker/model/RealmBean.java
@@ -65,4 +65,7 @@ public class RealmBean {
return realm.isEditUsernameAllowed();
}
+ public boolean isRegistrationEmailAsUsername() {
+ return realm.isRegistrationEmailAsUsername();
+ }
}
diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java
index 7a50644..f2f4951 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -417,6 +417,15 @@ public class AccountService extends AbstractSecuredLocalService {
user.setEmailVerified(false);
event.clone().event(EventType.UPDATE_EMAIL).detail(Details.PREVIOUS_EMAIL, oldEmail).detail(Details.UPDATED_EMAIL, email).success();
}
+
+ if (realm.isRegistrationEmailAsUsername()) {
+ UserModel existing = session.users().getUserByEmail(email, realm);
+ if (existing != null && !existing.getId().equals(user.getId())) {
+ throw new ModelDuplicateException(Messages.USERNAME_EXISTS);
+ }
+ user.setUsername(email);
+ }
+
setReferrerOnPage();
return account.setSuccess(Messages.ACCOUNT_UPDATED).createResponse(AccountPages.ACCOUNT);
} catch (ModelReadOnlyException roe) {
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountTest.java
index 90bf62b..b9afd9b 100755
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/account/AccountTest.java
@@ -395,6 +395,7 @@ public class AccountTest extends TestRealmKeycloakTest {
@Test
public void changeProfile() throws Exception {
setEditUsernameAllowed(false);
+ setRegistrationEmailAsUsername(false);
profilePage.open();
loginPage.login("test-user@localhost", "password");
@@ -463,12 +464,31 @@ public class AccountTest extends TestRealmKeycloakTest {
setEditUsernameAllowed(true);
}
+ @Test
+ public void changeProfileEmailAsUsernameEnabled() throws Exception {
+ setRegistrationEmailAsUsername(true);
+
+ profilePage.open();
+ loginPage.login("test-user@localhost", "password");
+ Assert.assertFalse(driver.findElements(By.id("username")).size() > 0);
+
+ // Revert
+ setRegistrationEmailAsUsername(false);
+
+ }
+
private void setEditUsernameAllowed(boolean allowed) {
RealmRepresentation testRealm = testRealm().toRepresentation();
testRealm.setEditUsernameAllowed(allowed);
testRealm().update(testRealm);
}
+ private void setRegistrationEmailAsUsername(boolean allowed) {
+ RealmRepresentation testRealm = testRealm().toRepresentation();
+ testRealm.setRegistrationEmailAsUsername(allowed);
+ testRealm().update(testRealm);
+ }
+
@Test
public void changeUsername() {
// allow to edit the username in realm
diff --git a/themes/src/main/resources/theme/base/account/account.ftl b/themes/src/main/resources/theme/base/account/account.ftl
index 87cd198..08433f8 100755
--- a/themes/src/main/resources/theme/base/account/account.ftl
+++ b/themes/src/main/resources/theme/base/account/account.ftl
@@ -14,15 +14,17 @@
<input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker?html}">
- <div class="form-group ${messagesPerField.printIfExists('username','has-error')}">
- <div class="col-sm-2 col-md-2">
- <label for="username" class="control-label">${msg("username")}</label> <#if realm.editUsernameAllowed><span class="required">*</span></#if>
- </div>
+ <#if !realm.registrationEmailAsUsername>
+ <div class="form-group ${messagesPerField.printIfExists('username','has-error')}">
+ <div class="col-sm-2 col-md-2">
+ <label for="username" class="control-label">${msg("username")}</label> <#if realm.editUsernameAllowed><span class="required">*</span></#if>
+ </div>
- <div class="col-sm-10 col-md-10">
- <input type="text" class="form-control" id="username" name="username" <#if !realm.editUsernameAllowed>disabled="disabled"</#if> value="${(account.username!'')?html}"/>
+ <div class="col-sm-10 col-md-10">
+ <input type="text" class="form-control" id="username" name="username" <#if !realm.editUsernameAllowed>disabled="disabled"</#if> value="${(account.username!'')?html}"/>
+ </div>
</div>
- </div>
+ </#if>
<div class="form-group ${messagesPerField.printIfExists('email','has-error')}">
<div class="col-sm-2 col-md-2">