mirror of
https://github.com/keycloak/keycloak.git
synced 2026-01-09 23:12:06 -03:30
Fix duplicate users on searching attributes with multiple entries
Closes #39246 Signed-off-by: koplas <pschwabauer@intevation.de>
This commit is contained in:
parent
4ed2e5f00d
commit
8f860c810e
@ -618,7 +618,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
|
||||
CriteriaQuery<Long> queryBuilder = builder.createQuery(Long.class);
|
||||
Root<UserEntity> root = queryBuilder.from(UserEntity.class);
|
||||
|
||||
queryBuilder.select(builder.count(root));
|
||||
queryBuilder.select(builder.countDistinct(root));
|
||||
|
||||
List<Predicate> predicates = new ArrayList<>();
|
||||
|
||||
@ -647,7 +647,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
|
||||
Root<UserGroupMembershipEntity> groupMembership = queryBuilder.from(UserGroupMembershipEntity.class);
|
||||
Join<UserGroupMembershipEntity, UserEntity> userJoin = groupMembership.join("user");
|
||||
|
||||
queryBuilder.select(builder.count(userJoin));
|
||||
queryBuilder.select(builder.countDistinct(userJoin));
|
||||
|
||||
List<Predicate> predicates = new ArrayList<>();
|
||||
|
||||
@ -669,7 +669,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
|
||||
CriteriaBuilder qb = em.getCriteriaBuilder();
|
||||
CriteriaQuery<Long> userQuery = qb.createQuery(Long.class);
|
||||
Root<UserEntity> from = userQuery.from(UserEntity.class);
|
||||
Expression<Long> count = qb.count(from);
|
||||
Expression<Long> count = qb.countDistinct(from);
|
||||
|
||||
userQuery = userQuery.select(count);
|
||||
List<Predicate> restrictions = predicates(params, from, Map.of());
|
||||
@ -694,7 +694,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
|
||||
|
||||
CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
|
||||
Root<UserEntity> root = countQuery.from(UserEntity.class);
|
||||
countQuery.select(cb.count(root));
|
||||
countQuery.select(cb.countDistinct(root));
|
||||
|
||||
List<Predicate> restrictions = predicates(params, root, Map.of());
|
||||
restrictions.add(cb.equal(root.get("realmId"), realm.getId()));
|
||||
@ -808,7 +808,7 @@ public class JpaUserProvider implements UserProvider, UserCredentialStore, JpaUs
|
||||
|
||||
predicates.addAll(AdminPermissionsSchema.SCHEMA.applyAuthorizationFilters(session, AdminPermissionsSchema.USERS, this, realm, builder, queryBuilder, root));
|
||||
|
||||
queryBuilder.where(predicates.toArray(Predicate[]::new)).orderBy(builder.asc(root.get(UserModel.USERNAME)));
|
||||
queryBuilder.distinct(true).where(predicates.toArray(Predicate[]::new)).orderBy(builder.asc(root.get(UserModel.USERNAME)));
|
||||
|
||||
TypedQuery<UserEntity> query = em.createQuery(queryBuilder);
|
||||
|
||||
|
||||
@ -782,7 +782,7 @@ public class UserTest extends AbstractAdminTest {
|
||||
|
||||
addAttribute(user, "test", Collections.singletonList("test" + i));
|
||||
addAttribute(user, "test" + i, Collections.singletonList("test" + i));
|
||||
addAttribute(user, "attr", Collections.singletonList("common"));
|
||||
addAttribute(user, "attr", Arrays.asList("common", "common2"));
|
||||
|
||||
ids.add(createUser(user));
|
||||
}
|
||||
@ -819,6 +819,11 @@ public class UserTest extends AbstractAdminTest {
|
||||
attributes = new HashMap<>();
|
||||
attributes.put("attr", "common");
|
||||
assertThat(realm.users().count(null, null, null, null, null, null, null, mapToSearchQuery(attributes)), is(9));
|
||||
|
||||
attributes = new HashMap<>();
|
||||
attributes.put("attr", "common");
|
||||
attributes.put(UserModel.EXACT, Boolean.FALSE.toString());
|
||||
assertThat(realm.users().count(null, null, null, null, null, null, null, mapToSearchQuery(attributes)), is(9));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user