diff --git a/core/src/main/java/org/keycloak/representations/idm/authorization/GroupPolicyRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/authorization/GroupPolicyRepresentation.java
index 4de4e97..d134aa2 100644
--- a/core/src/main/java/org/keycloak/representations/idm/authorization/GroupPolicyRepresentation.java
+++ b/core/src/main/java/org/keycloak/representations/idm/authorization/GroupPolicyRepresentation.java
@@ -17,6 +17,7 @@
package org.keycloak.representations.idm.authorization;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Set;
/**
@@ -76,12 +77,12 @@ public class GroupPolicyRepresentation extends AbstractPolicyRepresentation {
public void removeGroup(String... ids) {
if (groups != null) {
- for (final String id : ids) {
- if (!groups.remove(id)) {
- for (GroupDefinition group : new HashSet<>(groups)) {
- if (group.getPath().startsWith(id)) {
- groups.remove(group);
- }
+ for (String id : ids) {
+ Iterator<GroupDefinition> iterator = groups.iterator();
+ while (iterator.hasNext()) {
+ GroupDefinition group = iterator.next();
+ if (id.equals(group.getId()) || (group.getPath() != null && group.getPath().equals(id))) {
+ iterator.remove();
}
}
}
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/client/authorization/GroupPolicyManagementTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/client/authorization/GroupPolicyManagementTest.java
index 4decccf..ea7d840 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/client/authorization/GroupPolicyManagementTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/client/authorization/GroupPolicyManagementTest.java
@@ -151,6 +151,19 @@ public class GroupPolicyManagementTest extends AbstractPolicyManagementTest {
}
@Test
+ public void testRemoveWithoutPath() {
+ GroupPolicyRepresentation representation = new GroupPolicyRepresentation();
+
+ representation.setName("Delete Group Path Policy");
+ representation.setGroupsClaim("groups");
+ representation.addGroup("Group A");
+
+ representation.removeGroup("Group A");
+
+ assertTrue(representation.getGroups().isEmpty());
+ }
+
+ @Test
public void testGenericConfig() {
AuthorizationResource authorization = getClient().authorization();
GroupPolicyRepresentation representation = new GroupPolicyRepresentation();