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-quickstart要创建 Gradle 项目,请添加--
gradle or--gradle-kotlin-dsl选项。有关如何安装和使用 Quarkus CLI 的更多信息,请参阅 Quarkus CLI 指南。
使用 Maven:
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.20.1:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=security-keycloak-authorization-quickstart \ -Dextensions='oidc,keycloak-authorization,rest-jackson' \ -DnoCode cd security-keycloak-authorization-quickstart要创建 Gradle 项目,请添加
-DbuildTool=gradleor-DbuildTool=gradle-kotlin-dsl选项。
对于 Windows 用户:
-
如果使用 cmd,(不要使用反向斜杠
\并将所有内容放在同一行中) -
如果使用 Powershell,则双引号中的 wrap
-D参数,如"-DprojectArtifactId=security-keycloak-authorization-quickstart"
此命令生成带有 keycloak-authorization 扩展的新项目。扩展将 Keycloak 适配器集成到您的 Quarkus 应用程序中,提供必要的功能来与 Keycloak 服务器交互并执行 bearer 令牌授权。
为现有项目添加扩展
如果您已经有一个现有的 Quarkus 项目,您可以在项目的基本目录中运行以下命令来添加 oidc 和 keycloak-authorization 扩展:
使用 Quarkus CLI:
quarkus extension add oidc,keycloak-authorization使用 Maven:
./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 中管理和更新访问策略。