1.5. プロジェクトの作成
最初に、次のコマンドを使用して新しいプロジェクトを作成します。
Quarkus CLI を使用する場合:
quarkus create app org.acme:security-keycloak-authorization-quickstart \ --extension='oidc,keycloak-authorization,rest-jackson' \ --no-code cd security-keycloak-authorization-quickstartGradle プロジェクトを作成するには、
--gradleオプションまたは--gradle-kotlin-dslオプションを追加します。Quarkus CLI のインストール方法と使用方法の詳細は、Quarkus CLI ガイドを参照してください。
Maven を使用する場合:
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.27.1:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=security-keycloak-authorization-quickstart \ -Dextensions='oidc,keycloak-authorization,rest-jackson' \ -DnoCode cd security-keycloak-authorization-quickstartGradle プロジェクトを作成するには、
-DbuildTool=gradleまたは-DbuildTool=gradle-kotlin-dslオプションを追加します。
Windows ユーザーの場合:
-
cmd を使用する場合は、バックスラッシュ
\を使用せず、すべてを同じ行に記述してください。 -
Powershell を使用している場合は、二重引用符で wrap
-Dパラメーターを囲みます (例:"-DprojectArtifactId=security-keycloak-authorization-quickstart")
このコマンドは、keycloak-authorization エクステンションを備えた新しいプロジェクトを生成します。このエクステンションは、Keycloak Adapter を Quarkus アプリケーションに統合し、Keycloak サーバーと対話してベアラートークンの認可を実行するために必要な機能を提供します。
既存のプロジェクトにエクステンションを追加する
既存の Quarkus プロジェクトがある場合は、プロジェクトのベースディレクトリーで次のコマンドを実行して、oidc および keycloak-authorization エクステンションを追加できます。
Quarkus CLI を使用する場合:
quarkus extension add oidc,keycloak-authorizationMaven を使用する場合:
./mvnw quarkus:add-extension -Dextensions='oidc,keycloak-authorization'Gradle を使用する場合:
./gradlew addExtension --extensions='oidc,keycloak-authorization'
このコマンドは、ビルドファイルに以下の依存関係を追加します。
Maven を使用する場合:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-oidc</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-keycloak-authorization</artifactId> </dependency>Gradle を使用する場合:
implementation("io.quarkus:quarkus-oidc") implementation("io.quarkus:quarkus-keycloak-authorization")
/api/users/me エンドポイントの実装
最初に /api/users/me エンドポイントを実装します。次のコードは、ユーザーの詳細を提供する Jakarta REST リソースを定義します。
package org.acme.security.keycloak.authorization;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.jboss.resteasy.reactive.NoCache;
import io.quarkus.security.identity.SecurityIdentity;
@Path("/api/users")
public class UsersResource {
@Inject
SecurityIdentity identity;
@GET
@Path("/me")
@NoCache
public User me() {
return new User(identity);
}
public static class User {
private final String userName;
User(SecurityIdentity identity) {
this.userName = identity.getPrincipal().getName();
}
public String getUserName() {
return userName;
}
}
}
/api/admin エンドポイントの実装
次に、/api/admin エンドポイントを定義します。次のコードは、認証で保護された単純な Jakarta REST リソースを表しています。
package org.acme.security.keycloak.authorization;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import io.quarkus.security.Authenticated;
@Path("/api/admin")
@Authenticated
public class AdminResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String admin() {
return "granted";
}
}
Keycloak によるロールベースのアクセス制御
リソースへのアクセス制御を強制するために @RolesAllowed などの明示的なアノテーションが定義されていないことに注意してください。代わりに、keycloak-authorization エクステンションは、Keycloak 内の保護されたリソースの URI を動的にマッピングします。
アクセス制御は次のように管理されます。
- Keycloak は、設定されたポリシーに基づいて各リクエストの権限を評価します。
- エクステンションはこれらの権限を適用し、Keycloak で定義されたロールまたはポリシーに基づいてアクセスを許可または拒否します。
これにより、アクセス制御ロジックがアプリケーションコードから分離され、Keycloak で直接アクセスポリシーを管理および更新しやすくなります。