[KEYCLOAK-11352] - Can't request permissions by name by a non-owner resource service, although the audience is set
This commit is contained in:
parent
2a82ed6eea
commit
c37ca235ab
2 changed files with 54 additions and 1 deletions
|
@ -459,7 +459,7 @@ public class AuthorizationTokenService {
|
||||||
requestedResources.add(ownerResource);
|
requestedResources.add(ownerResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!identity.isResourceServer()) {
|
if (!identity.isResourceServer() || !identity.getId().equals(resourceServer.getId())) {
|
||||||
List<PermissionTicket> tickets = storeFactory.getPermissionTicketStore().findGranted(resourceName, identity.getId(), resourceServer.getId());
|
List<PermissionTicket> tickets = storeFactory.getPermissionTicketStore().findGranted(resourceName, identity.getId(), resourceServer.getId());
|
||||||
for (PermissionTicket permissionTicket : tickets) {
|
for (PermissionTicket permissionTicket : tickets) {
|
||||||
requestedResources.add(permissionTicket.getResource());
|
requestedResources.add(permissionTicket.getResource());
|
||||||
|
|
|
@ -89,6 +89,7 @@ import org.keycloak.representations.idm.authorization.ScopeRepresentation;
|
||||||
import org.keycloak.representations.idm.authorization.UserPolicyRepresentation;
|
import org.keycloak.representations.idm.authorization.UserPolicyRepresentation;
|
||||||
import org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude;
|
import org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude;
|
||||||
import org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer;
|
import org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer;
|
||||||
|
import org.keycloak.testsuite.admin.ApiUtil;
|
||||||
import org.keycloak.testsuite.util.ClientBuilder;
|
import org.keycloak.testsuite.util.ClientBuilder;
|
||||||
import org.keycloak.testsuite.util.OAuthClient;
|
import org.keycloak.testsuite.util.OAuthClient;
|
||||||
import org.keycloak.testsuite.util.RealmBuilder;
|
import org.keycloak.testsuite.util.RealmBuilder;
|
||||||
|
@ -1985,6 +1986,58 @@ public class EntitlementAPITest extends AbstractAuthzTest {
|
||||||
authzClient.authorization().authorize(request);
|
authzClient.authorization().authorize(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPermissionsAcrossResourceServers() throws Exception {
|
||||||
|
String rsAId;
|
||||||
|
try (Response response = getRealm().clients().create(ClientBuilder.create().clientId("rs-a").secret("secret").serviceAccount().authorizationServicesEnabled(true).build())) {
|
||||||
|
rsAId = ApiUtil.getCreatedId(response);
|
||||||
|
}
|
||||||
|
String rsBId;
|
||||||
|
try (Response response = getRealm().clients().create(ClientBuilder.create().clientId("rs-b").secret("secret").serviceAccount().authorizationServicesEnabled(true).build())) {
|
||||||
|
rsBId = ApiUtil.getCreatedId(response);
|
||||||
|
}
|
||||||
|
ClientResource rsB = getRealm().clients().get(rsBId);
|
||||||
|
|
||||||
|
rsB.authorization().resources().create(new ResourceRepresentation("Resource A"));
|
||||||
|
|
||||||
|
JSPolicyRepresentation grantPolicy = new JSPolicyRepresentation();
|
||||||
|
|
||||||
|
grantPolicy.setName("Grant Policy");
|
||||||
|
grantPolicy.setCode("$evaluation.grant();");
|
||||||
|
|
||||||
|
rsB.authorization().policies().js().create(grantPolicy);
|
||||||
|
|
||||||
|
ResourcePermissionRepresentation permission = new ResourcePermissionRepresentation();
|
||||||
|
|
||||||
|
permission.setName("Resource A Permission");
|
||||||
|
permission.addResource("Resource A");
|
||||||
|
permission.addPolicy(grantPolicy.getName());
|
||||||
|
|
||||||
|
rsB.authorization().permissions().resource().create(permission);
|
||||||
|
|
||||||
|
AuthzClient authzClient = getAuthzClient(AUTHZ_CLIENT_CONFIG);
|
||||||
|
Configuration config = authzClient.getConfiguration();
|
||||||
|
|
||||||
|
config.setResource("rs-a");
|
||||||
|
|
||||||
|
authzClient = AuthzClient.create(config);
|
||||||
|
AccessTokenResponse accessTokenResponse = authzClient.obtainAccessToken();
|
||||||
|
AccessToken accessToken = toAccessToken(accessTokenResponse.getToken());
|
||||||
|
|
||||||
|
config.setResource("rs-b");
|
||||||
|
|
||||||
|
AuthorizationRequest request = new AuthorizationRequest();
|
||||||
|
|
||||||
|
request.addPermission("Resource A");
|
||||||
|
|
||||||
|
AuthorizationResponse response = authzClient.authorization(accessTokenResponse.getToken()).authorize(request);
|
||||||
|
|
||||||
|
assertNotNull(response.getToken());
|
||||||
|
Collection<Permission> permissions = toAccessToken(response.getToken()).getAuthorization().getPermissions();
|
||||||
|
assertEquals(1, permissions.size());
|
||||||
|
assertEquals("Resource A", permissions.iterator().next().getResourceName());
|
||||||
|
}
|
||||||
|
|
||||||
private void testRptRequestWithResourceName(String configFile) {
|
private void testRptRequestWithResourceName(String configFile) {
|
||||||
Metadata metadata = new Metadata();
|
Metadata metadata = new Metadata();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue