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
    Copy to Clipboard Toggle word wrap

    要创建 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
    Copy to Clipboard Toggle word wrap

    要创建 Gradle 项目,请添加 -DbuildTool=gradle or -DbuildTool=gradle-kotlin-dsl 选项。

对于 Windows 用户:

  • 如果使用 cmd,(不要使用反向斜杠 \ 并将所有内容放在同一行中)
  • 如果使用 Powershell,则双引号中的 wrap -D 参数,如 "-DprojectArtifactId=security-keycloak-authorization-quickstart"

此命令生成带有 keycloak-authorization 扩展的新项目。扩展将 Keycloak 适配器集成到您的 Quarkus 应用程序中,提供必要的功能来与 Keycloak 服务器交互并执行 bearer 令牌授权。

为现有项目添加扩展

如果您已经有一个现有的 Quarkus 项目,您可以在项目的基本目录中运行以下命令来添加 oidckeycloak-authorization 扩展:

  • 使用 Quarkus CLI:

    quarkus extension add oidc,keycloak-authorization
    Copy to Clipboard Toggle word wrap
  • 使用 Maven:

    ./mvnw quarkus:add-extension -Dextensions='oidc,keycloak-authorization'
    Copy to Clipboard Toggle word wrap
  • 使用 Gradle:

    ./gradlew addExtension --extensions='oidc,keycloak-authorization'
    Copy to Clipboard Toggle word wrap

这个命令在构建文件中添加以下依赖项:

  • 使用 Maven:

    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-oidc</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-keycloak-authorization</artifactId>
    </dependency>
    Copy to Clipboard Toggle word wrap
  • 使用 Gradle:

    implementation("io.quarkus:quarkus-oidc")
    implementation("io.quarkus:quarkus-keycloak-authorization")
    Copy to Clipboard Toggle word wrap

实现 /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;
        }
    }
}
Copy to Clipboard Toggle word wrap

实现 /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";
    }
}
Copy to Clipboard Toggle word wrap

使用 Keycloak 的基于角色的访问控制

请注意,没有定义 @RolesAllowed 等显式注释来强制执行资源的访问控制。相反,keycloak-authorization 扩展会动态映射 Keycloak 中受保护的资源的 URI。

访问控制管理如下:

  • Keycloak 根据每个请求的策略评估权限。
  • 扩展强制执行这些权限,根据 Keycloak 中定义的角色或策略授予或拒绝访问。

这会把访问控制逻辑与应用程序代码分离,从而更轻松地在 Keycloak 中管理和更新访问策略。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat