keycloak-uncached

KEYCLOAK-2557 Cannot login with email if another user is using

3/2/2016 4:08:48 AM

Details

diff --git a/server-spi/src/main/java/org/keycloak/models/utils/KeycloakModelUtils.java b/server-spi/src/main/java/org/keycloak/models/utils/KeycloakModelUtils.java
index c4906d6..f3606c9 100755
--- a/server-spi/src/main/java/org/keycloak/models/utils/KeycloakModelUtils.java
+++ b/server-spi/src/main/java/org/keycloak/models/utils/KeycloakModelUtils.java
@@ -254,18 +254,21 @@ public final class KeycloakModelUtils {
     }
 
     /**
-     * Try to find user by given username. If it fails, then fallback to find him by email
+     * Try to find user by username or email
      *
      * @param realm    realm
      * @param username username or email of user
      * @return found user
      */
     public static UserModel findUserByNameOrEmail(KeycloakSession session, RealmModel realm, String username) {
-        UserModel user = session.users().getUserByUsername(username, realm);
-        if (user == null && username.contains("@")) {
-            user = session.users().getUserByEmail(username, realm);
+        if (username.indexOf('@') != -1) {
+            UserModel user = session.users().getUserByEmail(username, realm);
+            if (user != null) {
+                return user;
+            }
         }
-        return user;
+
+        return session.users().getUserByUsername(username, realm);
     }
 
     /**
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/LoginTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/LoginTest.java
index de3619d..777fd35 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/LoginTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/LoginTest.java
@@ -25,6 +25,7 @@ import org.keycloak.events.Details;
 import org.keycloak.events.Event;
 import org.keycloak.events.EventType;
 import org.keycloak.models.BrowserSecurityHeaders;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.PasswordPolicy;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserCredentialModel;
@@ -64,17 +65,13 @@ public class LoginTest {
 
         @Override
         public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
-            UserCredentialModel creds = new UserCredentialModel();
-            creds.setType(CredentialRepresentation.PASSWORD);
-            creds.setValue("password");
-
             UserModel user = manager.getSession().users().addUser(appRealm, "login-test");
             user.setEmail("login@test.com");
             user.setEnabled(true);
 
             userId = user.getId();
 
-            user.updateCredential(creds);
+            user.updateCredential(UserCredentialModel.password("password"));
 
             UserModel user2 = manager.getSession().users().addUser(appRealm, "login-test2");
             user2.setEmail("login2@test.com");
@@ -82,7 +79,7 @@ public class LoginTest {
 
             user2Id = user2.getId();
 
-            user2.updateCredential(creds);
+            user2.updateCredential(UserCredentialModel.password("password"));
         }
     });
 
@@ -304,10 +301,30 @@ public class LoginTest {
     }
 
     @Test
+    // KEYCLOAK-2557
+    public void loginUserWithEmailAsUsername() {
+        KeycloakSession session = keycloakRule.startSession();
+
+        UserModel user = session.users().addUser(session.realms().getRealmByName("test"), "login@test.com");
+        user.setEnabled(true);
+        user.updateCredential(UserCredentialModel.password("password"));
+
+        keycloakRule.stopSession(session, true);
+
+        loginPage.open();
+        loginPage.login("login@test.com", "password");
+        
+        Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
+        Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE));
+
+        events.expectLogin().user(userId).detail(Details.USERNAME, "login@test.com").assertEvent();
+    }
+
+    @Test
     public void loginSuccess() {
         loginPage.open();
         loginPage.login("login-test", "password");
-        
+
         Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
         Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE));