2.5. 组合身份验证机制
如果不同的源提供用户凭证,您可以组合身份验证机制。例如,您可以组合内置的 Basic 和 Quarkus quarkus-oidc
Bearer 令牌身份验证机制。
当第一个 SecurityIdentity
由其中一个身份验证机制生成后,身份验证过程就会马上完成。
2.5.1. 包含的身份验证 复制链接链接已复制到粘贴板!
在某些情况下,可能要求所有注册的身份验证机制都创建其 SecurityIdentity
。当用户通过虚拟专用网络进行身份验证时,或者当前令牌必须绑定到令牌验证才能成功通过 Mutual TLS 身份验证时,可能需要使用令牌验证。
在 Quarkus 中,此类身份验证名为 inclusive
,您可以启用它,如下所示:
quarkus.http.auth.inclusive=true
quarkus.http.auth.inclusive=true
如果身份验证包含,则由第一个身份验证机制创建的 SecurityIdentity
可以注入到应用程序代码中。例如,如果需要 Mutual TLS 身份验证和 基本身份验证机制身份验证,则 Mutual TLS 身份验证机制 将首先创建 SecurityIdentity
。
Mutual TLS 身份验证机制在启用包含身份验证时具有最高的优先级,以确保注入的 SecurityIdentity
始终代表 双向 TLS 身份验证,并可用于获取由其他身份验证机制提供的 SecurityIdentity
身份的访问。
可以在第一个 SecurityIdentity
上作为 quarkus.security.identities
属性访问额外的 SecurityIdentity
实例,但访问这些额外的身份可能并不需要访问这些额外身份,例如,当 Mutual TLS 身份验证和 OIDC Bearer 身份验证机制都已合并并完成其身份验证时,经过身份验证的 bearer 令牌可以注入令牌凭证,以及 Mutual TLS 身份验证 创建的 SecurityIdentity
。下面是一个示例:
您不能组合 Quarkus quarkus-oidc
Bearer 令牌和 smallrye-jwt
身份验证机制,因为这两种机制试图验证从 HTTP Bearer 令牌身份验证方案中提取的令牌。
2.5.2. 基于路径的身份验证 复制链接链接已复制到粘贴板!
2.5.2.1. 使用 HTTP 安全策略启用基于路径的身份验证 复制链接链接已复制到粘贴板!
以下配置示例演示了如何为给定请求路径强制执行单个可选择的身份验证机制:
确保 auth-mechanism
属性的值与 HttpAuthenticationMechanism
支持的身份验证方案匹配,例如 基本的
、bearer
或 表单
。
2.5.2.2. 使用注解为 Jakarta REST 端点启用基于路径的身份验证 复制链接链接已复制到粘贴板!
可以使用注解来选择特定于每个 Jakarta REST 端点的身份验证机制。只有在禁用 主动 身份验证时,此功能才会启用。因此,注解只能在与 REST 端点匹配后选择验证机制。以下是如何为每个 REST 端点选择身份验证机制:
quarkus.http.auth.proactive=false
quarkus.http.auth.proactive=false
身份验证机制^ | 注解 |
---|---|
基本身份验证机制 |
|
基于表单的验证机制 |
|
双向 TLS 身份验证机制 |
|
bearer 令牌身份验证机制 |
|
OIDC 授权代码流机制 |
|
smallrye JWT 身份验证机制 |
|
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.3. 使用包含的验证启用基于路径的身份验证 复制链接链接已复制到粘贴板!
默认情况下,Quarkus 只支持 每个路径的一个验证机制的基于路径的 验证。如果需要将多个身份验证机制用于基于路径的身份验证,您可以编写一个自定义 HttpAuthenticationMechanism
部分,如 Security Tips and Tricks 指南中有多个 HttpAuthenticationMechanism 部分所述。另一种选择是在 lax 模式中启用 Inclusive 身份验证,并编写自定义 HttpSecurityPolicy
或 PermissionChecker
,验证所有注册的 HTTP 身份验证机制是否创建了其机制特定的 SecurityIdentity
。
在 lax 模式中启用包含的身份验证
quarkus.http.auth.inclusive-mode=lax quarkus.http.auth.inclusive=true
quarkus.http.auth.inclusive-mode=lax
quarkus.http.auth.inclusive=true
- 1
- 默认情况下,包含的身份验证要求所有注册的 HTTP 身份验证机制都必须创建
SecurityIdentity
。但是,在 lax 模式中,如果至少一个注册的HttpAuthenticationMechanism
创建了SecurityIdentity
,则身份验证会成功。
假设我们有 3 个注册机制 mTLS、Basic 和 OIDC,您只需要 Basic 和 mTLS 身份验证才能成功访问 hello
方法。在这种情况下,在 lax 模式中启用包含的身份验证,可以检查生成身份的机制,如下例所示:
HTTP 身份验证机制检查示例
- 1
- 只有在确认
mTLS
和基本身份验证
机制都已验证当前请求时,才允许访问端点。
2.5.2.4. 如何将其与 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 quarkus.http.auth.permission.roles1.policy=roles1 quarkus.http.auth.permission.roles1.methods=GET
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
quarkus.http.auth.permission.roles1.policy=roles1
quarkus.http.auth.permission.roles1.methods=GET