Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,7 @@ public void addComposites(final @Parameter(description = "role's name (not id!)"
if (role == null) {
throw new NotFoundException("Could not find role");
}
auth.roles().requireManage(role);
addComposites(auth, adminEvent, uriInfo, roles, role);
}

Expand Down Expand Up @@ -487,6 +488,7 @@ public void deleteComposites(
if (role == null) {
throw new NotFoundException("Could not find role");
}
auth.roles().requireManage(role);
deleteComposites(adminEvent, uriInfo, roles, role);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
package org.keycloak.tests.admin.authz.rbac;

import java.util.List;
import java.util.Set;

import org.keycloak.Config;
Expand All @@ -28,7 +29,8 @@

import org.junit.jupiter.api.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;

@KeycloakIntegrationTest
Expand Down Expand Up @@ -147,6 +149,47 @@ public void testMasterRealmManageRealmAdminCannotDeleteAdminRealmRoleViaNameBase
});
}

@Test
public void testMasterRealmManageRealmAdminCannotDeleteCompositesFromAdminRealmRoleViaNameBasedEndpoint() {
grantMasterRealmManagementRole(Config.getAdminRealm(), masterUser.getUsername(), AdminRoles.MANAGE_REALM);

runAs(masterRealm.getName(), masterUser.getUsername(), client -> {
Set<RoleRepresentation> composites = client.realm(masterRealm.getName()).roles()
.get(AdminRoles.ADMIN).getRoleComposites();
int compositesBefore = composites.size();
RoleRepresentation targetComposite = composites.iterator().next();

assertForbidden("master-realm manage-realm admin must not delete composites from the 'admin' realm role via name-based endpoint",
() -> client.realm(masterRealm.getName()).roles().get(AdminRoles.ADMIN)
.deleteComposites(List.of(targetComposite)));

int compositesAfter = client.realm(masterRealm.getName()).roles()
.get(AdminRoles.ADMIN).getRoleComposites().size();
assertEquals(compositesBefore, compositesAfter);
});
}

@Test
public void testMasterRealmManageRealmAdminCannotAddCompositesToAdminRealmRoleViaNameBasedEndpoint() {
grantMasterRealmManagementRole(Config.getAdminRealm(), masterUser.getUsername(), AdminRoles.MANAGE_REALM);

runAs(masterRealm.getName(), masterUser.getUsername(), client -> {
adminClient.realm(masterRealm.getName()).roles().create(
new RoleRepresentation(TEMP_ROLE_NAME, "temp", false));
RoleRepresentation tempRole = adminClient.realm(masterRealm.getName()).roles()
.get(TEMP_ROLE_NAME).toRepresentation();

assertForbidden("master-realm manage-realm admin must not add composites to the 'admin' realm role via name-based endpoint",
() -> client.realm(masterRealm.getName()).roles().get(AdminRoles.ADMIN)
.addComposites(List.of(tempRole)));

boolean compositeAdded = client.realm(masterRealm.getName()).roles()
.get(AdminRoles.ADMIN).getRoleComposites().stream()
.anyMatch(r -> TEMP_ROLE_NAME.equals(r.getName()));
assertFalse(compositeAdded);
});
}

private RoleRepresentation renamed(RoleRepresentation original) {
RoleRepresentation renamed = new RoleRepresentation();
renamed.setId(original.getId());
Expand Down
Loading