diff --git a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java
index a1d5552..0580a50 100755
--- a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java
+++ b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java
@@ -16,14 +16,18 @@ public interface UsersResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
- public List<UserRepresentation> search(@QueryParam("username") String username,
+ public List<UserRepresentation> search(@QueryParam("username") String username,
@QueryParam("firstName") String firstName,
- @QueryParam("lastName") String lastName,
- @QueryParam("email") String email);
+ @QueryParam("lastName") String lastName,
+ @QueryParam("email") String email,
+ @QueryParam("first") Integer firstResult,
+ @QueryParam("max") Integer maxResults);
@GET
@Produces(MediaType.APPLICATION_JSON)
- public List<UserRepresentation> search(@QueryParam("search") String search);
+ public List<UserRepresentation> search(@QueryParam("search") String search,
+ @QueryParam("first") Integer firstResult,
+ @QueryParam("max") Integer maxResults);
@POST
@Consumes(MediaType.APPLICATION_JSON)
diff --git a/model/api/src/main/java/org/keycloak/models/UserFederationManager.java b/model/api/src/main/java/org/keycloak/models/UserFederationManager.java
index 13faf73..ce3eb7f 100755
--- a/model/api/src/main/java/org/keycloak/models/UserFederationManager.java
+++ b/model/api/src/main/java/org/keycloak/models/UserFederationManager.java
@@ -193,7 +193,7 @@ public class UserFederationManager implements UserProvider {
protected List<UserModel> query(PaginatedQuery pagedQuery, RealmModel realm, int firstResult, int maxResults) {
List<UserModel> results = new LinkedList<UserModel>();
- if (maxResults <= 0) return results;
+ if (maxResults == 0) return results;
int first = firstResult;
int max = maxResults;
do {
@@ -210,6 +210,7 @@ public class UserFederationManager implements UserProvider {
if (query.size() < max) return results;
first = query.size();
max -= added;
+ if (max <= 0) return results;
} while (true);
}
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
index de1cc06..79584ff 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
@@ -376,9 +376,6 @@ public class UsersResource {
attributes.put(UserModel.USERNAME, username);
}
userModels = session.users().searchForUserByAttributes(attributes, realm, firstResult, maxResults);
- for (UserModel user : userModels) {
- results.add(ModelToRepresentation.toRepresentation(user));
- }
} else {
userModels = session.users().getUsers(realm, firstResult, maxResults);
}
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/UserTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/UserTest.java
index d3981c4..a25f98e 100644
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/UserTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/UserTest.java
@@ -5,6 +5,8 @@ import org.keycloak.representations.idm.UserRepresentation;
import javax.ws.rs.ClientErrorException;
+import java.util.List;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@@ -36,4 +38,74 @@ public class UserTest extends AbstractClientTest {
}
}
+ private void createUsers() {
+ for (int i = 1; i < 10; i++) {
+ UserRepresentation user = new UserRepresentation();
+ user.setUsername("username" + i);
+ user.setEmail("user" + i + "@localhost");
+ user.setFirstName("First" + i);
+ user.setLastName("Last" + i);
+
+ realm.users().create(user);
+ }
+ }
+
+ @Test
+ public void searchByEmail() {
+ createUsers();
+
+ List<UserRepresentation> users = realm.users().search(null, null, null, "user1@localhost", null, null);
+ assertEquals(1, users.size());
+
+ users = realm.users().search(null, null, null, "@localhost", null, null);
+ assertEquals(9, users.size());
+ }
+
+ @Test
+ public void searchByUsername() {
+ createUsers();
+
+ List<UserRepresentation> users = realm.users().search("username1", null, null, null, null, null);
+ assertEquals(1, users.size());
+
+ users = realm.users().search("user", null, null, null, null, null);
+ assertEquals(9, users.size());
+ }
+
+ @Test
+ public void search() {
+ createUsers();
+
+ List<UserRepresentation> users = realm.users().search("username1", null, null);
+ assertEquals(1, users.size());
+
+ users = realm.users().search("first1", null, null);
+ assertEquals(1, users.size());
+
+ users = realm.users().search("last", null, null);
+ assertEquals(9, users.size());
+ }
+
+ @Test
+ public void searchPaginated() {
+ createUsers();
+
+ List<UserRepresentation> users = realm.users().search("username", 0, 1);
+ assertEquals(1, users.size());
+ assertEquals("username1", users.get(0).getUsername());
+
+ users = realm.users().search("username", 5, 2);
+ assertEquals(2, users.size());
+ assertEquals("username6", users.get(0).getUsername());
+ assertEquals("username7", users.get(1).getUsername());
+
+ users = realm.users().search("username", 7, 20);
+ assertEquals(2, users.size());
+ assertEquals("username8", users.get(0).getUsername());
+ assertEquals("username9", users.get(1).getUsername());
+
+ users = realm.users().search("username", 0, 20);
+ assertEquals(9, users.size());
+ }
+
}