搜索

2.5. 组合身份验证机制

download PDF

如果不同的源提供用户凭证,您可以组合身份验证机制。例如,您可以组合内置的 Basic 和 Quarkus quarkus-oidc Bearer 令牌身份验证机制。

重要

您不能组合 Quarkus quarkus-oidc Bearer 令牌和 smallrye-jwt 身份验证机制,因为这两种机制试图验证从 HTTP Bearer 令牌身份验证方案中提取的令牌。

2.5.1. 使用 HTTP 安全策略启用基于路径的身份验证

以下配置示例演示了如何为给定请求路径强制执行单个可选择的身份验证机制:

quarkus.http.auth.permission.basic-or-bearer.paths=/service
quarkus.http.auth.permission.basic-or-bearer.policy=authenticated

quarkus.http.auth.permission.basic.paths=/basic-only
quarkus.http.auth.permission.basic.policy=authenticated
quarkus.http.auth.permission.basic.auth-mechanism=basic

quarkus.http.auth.permission.bearer.paths=/bearer-only
quarkus.http.auth.permission.bearer.policy=authenticated
quarkus.http.auth.permission.bearer.auth-mechanism=bearer

确保 auth-mechanism 属性的值与 HttpAuthenticationMechanism 支持的身份验证方案匹配,例如 基本的bearer表单

2.5.2. 使用注解为 Jakarta REST 端点启用基于路径的身份验证

可以使用注解来选择特定于每个 Jakarta REST 端点的身份验证机制。只有在禁用 主动 身份验证时,此功能才会启用。因此,注解只能在与 REST 端点匹配后选择验证机制。以下是如何为每个 REST 端点选择身份验证机制:

quarkus.http.auth.proactive=false
import io.quarkus.oidc.AuthorizationCodeFlow;
import io.quarkus.vertx.http.runtime.security.annotation.BasicAuthentication;
import jakarta.annotation.security.RolesAllowed;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;

@Path("hello")
public class HelloResource {

    @GET
    @BasicAuthentication 1 2
    @Path("basic")
    public String basicAuthMechanism() {
        return "basic";
    }

    @GET
    @RolesAllowed("admin") 3
    @AuthorizationCodeFlow 4
    @Path("code-flow")
    public String codeFlowAuthMechanism() {
        return "code-flow";
    }
}
1
REST 端点 /hello/basic 只能通过 基本身份验证 访问。
2
此端点需要身份验证,因为当没有标准安全注释时,@BasicAuthentication 注释会被默认添加 @Authenticated 注释。
3
@AuthorizationCodeFlow 注释可以与任何其他标准安全注释(如 @RolesAllowed@PermissionsAllowed 等)结合使用。
4
REST 端点 /hello/code-flow 只能通过 OIDC 授权代码流机制 访问。
表 2.3. 支持的身份验证机制注解
身份验证机制^注解

基本身份验证机制

io.quarkus.vertx.http.runtime.security.annotation.BasicAuthentication

基于表单的验证机制

io.quarkus.vertx.http.runtime.security.annotation.FormAuthentication

双向 TLS 身份验证机制

io.quarkus.vertx.http.runtime.security.annotation.MTLSAuthentication

bearer 令牌身份验证机制

io.quarkus.oidc.BearerTokenAuthentication

OIDC 授权代码流机制

io.quarkus.oidc.AuthorizationCodeFlow

smallrye JWT 身份验证机制

io.quarkus.smallrye.jwt.runtime.auth.BearerTokenAuthentication

提示

Quarkus 会自动保护使用身份验证机制注解注解的端点。当 REST 端点和资源中没有标准安全注解时,会为您添加 io.quarkus.security.Authenticated 注解。

也可以使用 io.quarkus.vertx.http.runtime.security.annotation.HttpAuthenticationMechanism 注释来选择基于其方案的任何身份验证机制。基于注释的 analogy 到 quarkus.http.auth.permission.basic.auth-mechanism=custom 配置属性是 @HttpAuthenticationMechanism ("custom") 注释。

注意

为了与各种 Jakarta EE 规格保持一致,建议始终重复注释,而不依赖于注解继承。

2.5.2.1. 如何将其与 HTTP 安全策略合并

定义允许访问单个资源的角色的最简单方法是 @RolesAllowed 注释。但是,也可以使用 HTTP 安全策略,如下例所示:

quarkus.http.auth.policy.roles1.roles-allowed=user
quarkus.http.auth.permission.roles1.paths=/hello/code-flow
quarkus.http.auth.permission.roles1.applies-to=JAXRS 1
quarkus.http.auth.permission.roles1.policy=roles1
quarkus.http.auth.permission.roles1.methods=GET 2
1
在选择了特定于端点的身份验证机制后,延迟此策略的权限检查。
2
使 roles1 权限仅与使用 @AuthorizationCodeFlow 注释标注的端点匹配。Unannotated 端点必须避免 apply -to=JAXRS 选项导致的延迟。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.