mirror of
https://github.com/keycloak/keycloak.git
synced 2026-01-25 16:42:34 +00:00
Calling getTopLevelGroups is slow inside GroupLDAPStorageMapper#getLDAPGroupMappingsConverted (#8430)
Closes #14820 --------- Co-authored-by: Michal Hajas <mhajas@redhat.com>
This commit is contained in:
@@ -22,6 +22,7 @@ import org.keycloak.models.Constants;
|
||||
import org.keycloak.models.GroupModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.utils.KeycloakModelUtils;
|
||||
import org.keycloak.testsuite.model.KeycloakModelTest;
|
||||
|
||||
import java.util.Arrays;
|
||||
@@ -29,9 +30,11 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.notNullValue;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.contains;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.nullValue;
|
||||
|
||||
public class GroupModelTest extends KeycloakModelTest {
|
||||
|
||||
@@ -99,4 +102,125 @@ public class GroupModelTest extends KeycloakModelTest {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGroupByName() {
|
||||
String subGroupId1 = withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group = session.groups().createGroup(realm, "parent-1");
|
||||
GroupModel subGroup = session.groups().createGroup(realm, "sub-group-1", group);
|
||||
return subGroup.getId();
|
||||
});
|
||||
|
||||
String subGroupId2 = withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group = session.groups().createGroup(realm, "parent-2");
|
||||
GroupModel subGroup = session.groups().createGroup(realm, "sub-group-1", group);
|
||||
return subGroup.getId();
|
||||
});
|
||||
withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group1 = session.groups().getGroupByName(realm, null,"parent-1");
|
||||
GroupModel group2 = session.groups().getGroupByName(realm, null,"parent-2");
|
||||
|
||||
GroupModel subGroup1 = session.groups().getGroupByName(realm, group1,"sub-group-1");
|
||||
GroupModel subGroup2 = session.groups().getGroupByName(realm, group2,"sub-group-1");
|
||||
|
||||
assertThat(subGroup1.getId(), equalTo(subGroupId1));
|
||||
assertThat(subGroup1.getName(), equalTo("sub-group-1"));
|
||||
assertThat(subGroup2.getId(), equalTo(subGroupId2));
|
||||
assertThat(subGroup2.getName(), equalTo("sub-group-1"));
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConflictingNames() {
|
||||
final String conflictingGroupName = "conflicting-group-name";
|
||||
|
||||
String parentGroupWithChildId = withRealm(realmId, (session, realm) -> {
|
||||
GroupModel parentGroupWithChild = session.groups().createGroup(realm, "parent-1");
|
||||
GroupModel subGroup1 = session.groups().createGroup(realm, conflictingGroupName, parentGroupWithChild);
|
||||
return parentGroupWithChild.getId();
|
||||
});
|
||||
|
||||
String parentGroupWithConflictingNameId = withRealm(realmId, (session, realm) -> session.groups().createGroup(realm, conflictingGroupName).getId());
|
||||
String parentGroupWithoutChildrenId = withRealm(realmId, (session, realm) -> session.groups().createGroup(realm, "parent-2").getId());
|
||||
|
||||
withRealm(realmId, (session, realm) -> {
|
||||
GroupModel searchedGroup = session.groups().getGroupByName(realm, null, conflictingGroupName);
|
||||
assertThat(searchedGroup, notNullValue());
|
||||
assertThat(searchedGroup.getId(), equalTo(parentGroupWithConflictingNameId));
|
||||
return null;
|
||||
});
|
||||
|
||||
withRealm(realmId, (session, realm) -> {
|
||||
GroupModel parentGroupWithChild = session.groups().getGroupById(realm, parentGroupWithChildId);
|
||||
GroupModel searchedGroup = session.groups().getGroupByName(realm, parentGroupWithChild, conflictingGroupName);
|
||||
assertThat(searchedGroup, notNullValue());
|
||||
assertThat(searchedGroup.getParentId(), equalTo(parentGroupWithChildId));
|
||||
return null;
|
||||
});
|
||||
|
||||
withRealm(realmId, (session, realm) -> {
|
||||
GroupModel parentGroupWithoutChildren = session.groups().getGroupById(realm, parentGroupWithoutChildrenId);
|
||||
GroupModel searchedGroup = session.groups().getGroupByName(realm, parentGroupWithoutChildren, conflictingGroupName);
|
||||
assertThat(searchedGroup, nullValue());
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGroupByNameCacheInvalidation() {
|
||||
String subGroupId1 = withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group = session.groups().createGroup(realm, "parent-1");
|
||||
GroupModel subGroup = session.groups().createGroup(realm, "sub-group-1", group);
|
||||
return subGroup.getId();
|
||||
});
|
||||
|
||||
withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group1 = session.groups().getGroupByName(realm, null, "parent-1");
|
||||
GroupModel subGroup1 = session.groups().getGroupByName(realm, group1, "sub-group-1");
|
||||
assertThat(subGroup1.getId(), equalTo(subGroupId1));
|
||||
return null;
|
||||
});
|
||||
|
||||
withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group1 = session.groups().getGroupByName(realm, null, "parent-1");
|
||||
GroupModel subGroup1 = session.groups().getGroupByName(realm, group1, "sub-group-1");
|
||||
session.groups().removeGroup(realm, subGroup1);
|
||||
return null;
|
||||
});
|
||||
|
||||
withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group1 = session.groups().getGroupByName(realm, null, "parent-1");
|
||||
GroupModel subGroup1 = session.groups().getGroupByName(realm, group1, "sub-group-1");
|
||||
assertThat(subGroup1, nullValue());
|
||||
return null;
|
||||
});
|
||||
|
||||
}
|
||||
@Test
|
||||
public void testFindGroupByPath() {
|
||||
String subGroupId1 = withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group = session.groups().createGroup(realm, "parent-1");
|
||||
GroupModel subGroup = session.groups().createGroup(realm, "sub-group-1", group);
|
||||
return subGroup.getId();
|
||||
});
|
||||
|
||||
String subGroupIdWithSlash = withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group = session.groups().createGroup(realm, "parent-2");
|
||||
GroupModel subGroup = session.groups().createGroup(realm, "sub-group/1", group);
|
||||
return subGroup.getId();
|
||||
});
|
||||
|
||||
withRealm(realmId, (session, realm) -> {
|
||||
GroupModel group1 = KeycloakModelUtils.findGroupByPath(session.groups(), realm, "/parent-1");
|
||||
GroupModel group2 = KeycloakModelUtils.findGroupByPath(session.groups(), realm, "/parent-2");
|
||||
assertThat(group1.getName(), equalTo("parent-1"));
|
||||
assertThat(group2.getName(), equalTo("parent-2"));
|
||||
|
||||
GroupModel subGroup1 = KeycloakModelUtils.findGroupByPath(session.groups(), realm, "/parent-1/sub-group-1");
|
||||
GroupModel subGroup2 = KeycloakModelUtils.findGroupByPath(session.groups(), realm, "/parent-2/sub-group/1");
|
||||
assertThat(subGroup1.getId(), equalTo(subGroupId1));
|
||||
assertThat(subGroup2.getId(), equalTo(subGroupIdWithSlash));
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user