Skip to content

Commit 2142a07

Browse files
author
Jean-Baptiste PIN
committed
Add option in admin group search by name to reproduce previous behavoir
1 parent 1f47cb2 commit 2142a07

File tree

3 files changed

+75
-3
lines changed

3 files changed

+75
-3
lines changed

server-spi-private/src/main/java/org/keycloak/models/utils/ModelToRepresentation.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,12 @@ public static GroupRepresentation toRepresentation(GroupModel group, boolean ful
152152
}
153153

154154
public static Stream<GroupRepresentation> searchForGroupByName(RealmModel realm, boolean full, String search, Integer first, Integer max) {
155+
return searchForGroupByName(realm, full, search, first, max, false);
156+
}
157+
158+
public static Stream<GroupRepresentation> searchForGroupByName(RealmModel realm, boolean full, String search, Integer first, Integer max, boolean filterSubGroup) {
155159
return realm.searchForGroupByNameStream(search, first, max)
156-
.map(g -> toGroupHierarchy(g, full, search));
160+
.map(g -> toGroupHierarchy(g, full, filterSubGroup ? search : null));
157161
}
158162

159163
public static Stream<GroupRepresentation> searchForGroupByName(UserModel user, boolean full, String search, Integer first, Integer max) {

services/src/main/java/org/keycloak/services/resources/admin/GroupsResource.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,12 @@ public GroupsResource(RealmModel realm, KeycloakSession session, AdminPermission
7777
public Stream<GroupRepresentation> getGroups(@QueryParam("search") String search,
7878
@QueryParam("first") Integer firstResult,
7979
@QueryParam("max") Integer maxResults,
80-
@QueryParam("briefRepresentation") @DefaultValue("true") boolean briefRepresentation) {
80+
@QueryParam("briefRepresentation") @DefaultValue("true") boolean briefRepresentation,
81+
@QueryParam("filterSubGroup") @DefaultValue("true") boolean filterSubGroup) {
8182
auth.groups().requireList();
8283

8384
if (Objects.nonNull(search)) {
84-
return ModelToRepresentation.searchForGroupByName(realm, !briefRepresentation, search.trim(), firstResult, maxResults);
85+
return ModelToRepresentation.searchForGroupByName(realm, !briefRepresentation, search.trim(), firstResult, maxResults, filterSubGroup);
8586
} else if(Objects.nonNull(firstResult) && Objects.nonNull(maxResults)) {
8687
return ModelToRepresentation.toGroupHierarchy(realm, !briefRepresentation, firstResult, maxResults);
8788
} else {

testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/group/GroupTest.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,73 @@ public void searchForGroupsShouldOnlyReturnMatchingElementsOrIntermediatePaths()
971971
}
972972
}
973973

974+
/**
975+
* Provide an option to include subgroup in group search admin API
976+
* @link https://github.com/keycloak/keycloak/issues/9435
977+
*/
978+
@Test
979+
public void searchForGroupsFilterSubGroup() {
980+
981+
/*
982+
* /g1/g1.1-gugu
983+
* /g1/g1.2-test1234
984+
* /g2-test1234
985+
* /g3/g3.1-test1234/g3.1.1
986+
*/
987+
String needle = "test1234";
988+
GroupRepresentation g1 = GroupBuilder.create().name("g1").build();
989+
GroupRepresentation g1_1 = GroupBuilder.create().name("g1.1-bubu").build();
990+
GroupRepresentation g1_2 = GroupBuilder.create().name("g1.2-" + needle).build();
991+
GroupRepresentation g2 = GroupBuilder.create().name("g2-" + needle).build();
992+
GroupRepresentation g3 = GroupBuilder.create().name("g3").build();
993+
GroupRepresentation g3_1 = GroupBuilder.create().name("g3.1-" + needle).build();
994+
GroupRepresentation g3_1_1 = GroupBuilder.create().name("g3.1.1").build();
995+
996+
String realmName = AuthRealm.TEST;
997+
RealmResource realm = adminClient.realms().realm(realmName);
998+
999+
createGroup(realm, g1);
1000+
createGroup(realm, g2);
1001+
createGroup(realm, g3);
1002+
addSubGroup(realm, g1, g1_1);
1003+
addSubGroup(realm, g1, g1_2);
1004+
addSubGroup(realm, g3, g3_1);
1005+
addSubGroup(realm, g3_1, g3_1_1);
1006+
1007+
try {
1008+
// we search for "test1234" and expect only /g1/g1.2-test1234, /g2-test1234 and /g3/g3.1-test1234 as a result
1009+
List<GroupRepresentation> result = realm.groups().groups(needle, 0, 100, true, true);
1010+
1011+
assertEquals(3, result.size());
1012+
assertEquals("g1", result.get(0).getName());
1013+
assertEquals(1, result.get(0).getSubGroups().size());
1014+
assertEquals("g1.2-" + needle, result.get(0).getSubGroups().get(0).getName());
1015+
assertEquals("g2-" + needle, result.get(1).getName());
1016+
assertEquals("g3", result.get(2).getName());
1017+
assertEquals(1, result.get(2).getSubGroups().size());
1018+
assertEquals("g3.1-" + needle, result.get(2).getSubGroups().get(0).getName());
1019+
1020+
// we search for "test1234" and expect all groups
1021+
result = realm.groups().groups(needle, 0, 100, true, false);
1022+
assertEquals(3, result.size());
1023+
assertEquals(2, result.get(0).getSubGroups().size());
1024+
assertEquals(1, result.get(2).getSubGroups().get(0).getSubGroups().size());
1025+
1026+
} finally {
1027+
if (g1.getId() != null) {
1028+
realm.groups().group(g1.getId()).remove();
1029+
}
1030+
1031+
if (g2.getId() != null) {
1032+
realm.groups().group(g2.getId()).remove();
1033+
}
1034+
1035+
if (g3.getId() != null) {
1036+
realm.groups().group(g3.getId()).remove();
1037+
}
1038+
}
1039+
}
1040+
9741041
/**
9751042
* Verifies that the role assigned to a user's group is correctly handled by Keycloak Admin endpoint.
9761043
* @link https://issues.jboss.org/browse/KEYCLOAK-2964

0 commit comments

Comments
 (0)