1.16. プログラムを使用して権限スコープを確認する
リソース権限に加えて、メソッドスコープを定義できます。スコープは通常、リソースに対して実行されるアクションを表します。メソッドスコープを使用して、Keycloak Authorization Policy を強制する設定を作成できます。以下に例を示します。
# path policy with enforced scope 'read' for method 'GET'
quarkus.keycloak.policy-enforcer.paths.1.name=Scope Permission Resource
quarkus.keycloak.policy-enforcer.paths.1.paths=/api/protected/standard-way
quarkus.keycloak.policy-enforcer.paths.1.methods.get.method=GET
quarkus.keycloak.policy-enforcer.paths.1.methods.get.scopes=read
# path policies without scope
quarkus.keycloak.policy-enforcer.paths.2.name=Scope Permission Resource
quarkus.keycloak.policy-enforcer.paths.2.paths=/api/protected/programmatic-way,/api/protected/annotation-way
- 1
- ユーザーは、リソース権限
Scope Permission Resourceおよびreadスコープを持っている必要があります。
Keycloak Policy Enforcer は /api/protected/standard-way リクエストパスを保護し、@RolesAllowed などのアノテーションの必要性を排除します。ただし、シナリオによっては、プログラムによるチェックを実行する必要がある場合があります。
これは、以下の例のように SecurityIdentity インスタンスを Bean に注入することで実現できます。または、@PermissionsAllowed でリソースメソッドにアノテーションを付けると、同じ結果を得られます。以下の例は、3 つのリソースメソッドを示しており、それぞれに同じ read スコープが必要です。
import java.security.BasicPermission;
import java.util.List;
import jakarta.inject.Inject;
import jakarta.ws.rs.ForbiddenException;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.keycloak.representations.idm.authorization.Permission;
import io.quarkus.security.PermissionsAllowed;
import io.quarkus.security.identity.SecurityIdentity;
import io.smallrye.mutiny.Uni;
@Path("/api/protected")
public class ProtectedResource {
@Inject
SecurityIdentity identity;
@GET
@Path("/standard-way")
public Uni<List<Permission>> standardWay() {
return Uni.createFrom().item(identity.<List<Permission>> getAttribute("permissions"));
}
@GET
@Path("/programmatic-way")
public Uni<List<Permission>> programmaticWay() {
var requiredPermission = new BasicPermission("Scope Permission Resource") {
@Override
public String getActions() {
return "read";
}
};
return identity.checkPermission(requiredPermission).onItem()
.transform(granted -> {
if (granted) {
return identity.getAttribute("permissions");
}
throw new ForbiddenException();
});
}
@PermissionsAllowed("Scope Permission Resource:read")
@GET
@Path("/annotation-way")
public Uni<List<Permission>> annotationWay() {
return Uni.createFrom().item(identity.<List<Permission>> getAttribute("permissions"));
}
}
- 1
/standard-wayサブパスには、application.propertiesファイルで設定された設定に基づいて、リソース権限とreadスコープの両方が必要です。- 2
/programmatic-wayサブパスは、デフォルトではScope Permission Resource権限のみをチェックします。ただし、SecurityIdentity#checkPermissionを使用すると、スコープ要件などの追加の制約を適用できます。- 3
/annotation-wayの@PermissionsAllowedアノテーションは、readスコープとともにScope Permission Resource権限を持つリクエストへのアクセスを制限します。詳細は、セキュリティー認可ガイドの アノテーションを使用した認可 セクションを参照してください。