Details
diff --git a/model/api/src/main/java/org/keycloak/models/RealmModel.java b/model/api/src/main/java/org/keycloak/models/RealmModel.java
index f49cf8e..57ec2ae 100755
--- a/model/api/src/main/java/org/keycloak/models/RealmModel.java
+++ b/model/api/src/main/java/org/keycloak/models/RealmModel.java
@@ -133,6 +133,8 @@ public interface RealmModel extends RoleContainerModel, RoleMapperModel, ScopeMa
public void setAutomaticRegistrationAfterSocialLogin(boolean automaticRegistrationAfterSocialLogin);
+ List<UserModel> searchForUser(String search);
+
List<UserModel> searchForUserByAttributes(Map<String, String> attributes);
OAuthClientModel addOAuthClient(String name);
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
index faeea27..f3463c7 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
@@ -676,6 +676,16 @@ public class RealmAdapter implements RealmModel {
}
@Override
+ public List<UserModel> searchForUser(String search) {
+ TypedQuery<UserEntity> query = em.createQuery("select u from UserEntity u where lower(u.loginName) like :search or lower(concat(u.firstName, ' ', u.lastName)) like :search or u.email like :search", UserEntity.class);
+ query.setParameter("search", "%" + search.toLowerCase() + "%");
+ List<UserEntity> results = query.getResultList();
+ List<UserModel> users = new ArrayList<UserModel>();
+ for (UserEntity entity : results) users.add(new UserAdapter(entity));
+ return users;
+ }
+
+ @Override
public List<UserModel> searchForUserByAttributes(Map<String, String> attributes) {
StringBuilder builder = new StringBuilder("select u from UserEntity u");
boolean first = true;
diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
index 88bad1f..3767e65 100755
--- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
+++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
@@ -36,6 +36,7 @@ import org.picketlink.idm.model.sample.Role;
import org.picketlink.idm.model.sample.SampleModel;
import org.picketlink.idm.model.sample.User;
import org.picketlink.idm.query.IdentityQuery;
+import org.picketlink.idm.query.QueryParameter;
import org.picketlink.idm.query.RelationshipQuery;
import java.io.IOException;
@@ -877,6 +878,26 @@ public class RealmAdapter implements RealmModel {
}
@Override
+ public List<UserModel> searchForUser(String search) {
+ QueryParameter[] params = new QueryParameter[] { User.LOGIN_NAME, User.FIRST_NAME, User.LAST_NAME, User.EMAIL };
+
+ Map<String, User> users = new HashMap<String, User>();
+ for (QueryParameter p : params) {
+ IdentityQuery<User> query = getIdm().createIdentityQuery(User.class);
+ query.setParameter(p, search.toLowerCase());
+ for (User u : query.getResultList()) {
+ users.put(u.getLoginName(), u);
+ }
+ }
+
+ List<UserModel> userModels = new ArrayList<UserModel>();
+ for (User user : users.values()) {
+ userModels.add(new UserAdapter(user, idm));
+ }
+ return userModels;
+ }
+
+ @Override
public List<UserModel> searchForUserByAttributes(Map<String, String> attributes) {
IdentityQuery<User> query = getIdm().createIdentityQuery(User.class);
for (Map.Entry<String, String> entry : attributes.entrySet()) {
diff --git a/services/src/main/java/org/keycloak/services/managers/RealmManager.java b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
index 6c72da6..2b6aa61 100755
--- a/services/src/main/java/org/keycloak/services/managers/RealmManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
@@ -350,49 +350,7 @@ public class RealmManager {
if (searchString == null) {
return Collections.emptyList();
}
-
- String search = searchString.trim();
- if (search.contains(" ")) { //first and last name
- String[] split = search.split(" ");
- if (split.length != 2) {
- return Collections.emptyList();
- }
- Map<String, String> attributes = new HashMap<String, String>();
- attributes.put(UserModel.FIRST_NAME, split[0]);
- attributes.put(UserModel.LAST_NAME, split[1]);
- return realmModel.searchForUserByAttributes(attributes);
- } else if (search.contains("@")) { // email
- Map<String, String> attributes = new HashMap<String, String>();
- attributes.put(UserModel.EMAIL, search);
- return realmModel.searchForUserByAttributes(attributes);
- } else { // username and lastname
- Map<String, String> attributes = new HashMap<String, String>();
- attributes.put(UserModel.LOGIN_NAME, search);
- List<UserModel> usernameQuery = realmModel.searchForUserByAttributes(attributes);
- attributes.clear();
- attributes.put(UserModel.LAST_NAME, search);
- List<UserModel> lastnameQuery = realmModel.searchForUserByAttributes(attributes);
- if (usernameQuery.size() == 0) {
- return lastnameQuery;
- } else if (lastnameQuery.size() == 0) {
- return usernameQuery;
- }
- List<UserModel> results = new ArrayList<UserModel>();
- results.addAll(usernameQuery);
- for (UserModel lastnameUser : lastnameQuery) {
- boolean found = false;
- for (UserModel usernameUser : usernameQuery) {
- if (usernameUser.getLoginName().equals(lastnameUser.getLoginName())) {
- found = true;
- break;
- }
- }
- if (!found) {
- results.add(lastnameUser);
- }
- }
- return results;
- }
+ return realmModel.searchForUser(searchString.trim());
}
public void addRequiredCredential(RealmModel newRealm, String requiredCred) {
diff --git a/services/src/test/java/org/keycloak/test/AdapterTest.java b/services/src/test/java/org/keycloak/test/AdapterTest.java
index 0ad0169..7c2d405 100755
--- a/services/src/test/java/org/keycloak/test/AdapterTest.java
+++ b/services/src/test/java/org/keycloak/test/AdapterTest.java
@@ -20,6 +20,8 @@ import org.keycloak.services.managers.RealmManager;
import org.keycloak.test.common.AbstractKeycloakTest;
import org.keycloak.test.common.SessionFactoryTestContext;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -233,6 +235,16 @@ public class AdapterTest extends AbstractKeycloakTest {
user.setLastName("Burke");
user.setFirstName("Bill");
user.setEmail("bburke@redhat.com");
+
+ UserModel user2 = realmModel.addUser("doublefirst");
+ user2.setFirstName("Knut Ole");
+ user2.setLastName("Alver");
+ user2.setEmail("knut@redhat.com");
+
+ UserModel user3 = realmModel.addUser("doublelast");
+ user3.setFirstName("Ole");
+ user3.setLastName("Alver Veland");
+ user3.setEmail("knut@redhat.com");
}
RealmManager adapter = getRealmManager();
@@ -252,7 +264,7 @@ public class AdapterTest extends AbstractKeycloakTest {
}
{
- List<UserModel> userModels = adapter.searchUsers("bil burk", realmModel);
+ List<UserModel> userModels = adapter.searchUsers("bill burk", realmModel);
Assert.assertEquals(userModels.size(), 1);
UserModel bburke = userModels.get(0);
Assert.assertEquals(bburke.getFirstName(), "Bill");
@@ -260,6 +272,15 @@ public class AdapterTest extends AbstractKeycloakTest {
Assert.assertEquals(bburke.getEmail(), "bburke@redhat.com");
}
+ {
+ ArrayList<String> users = new ArrayList<String>();
+ for (UserModel u : adapter.searchUsers("ole alver", realmModel)) {
+ users.add(u.getLoginName());
+ }
+ String[] usernames = users.toArray(new String[users.size()]);
+ Arrays.sort(usernames);
+ Assert.assertArrayEquals(new String[] { "doublefirst", "doublelast"}, usernames);
+ }
{
List<UserModel> userModels = adapter.searchUsers("bburke@redhat.com", realmModel);