安全架构
摘要
提供有关红帽构建的 Quarkus 文档的反馈 复制链接链接已复制到粘贴板!
要报告错误或改进文档,请登录到 Red Hat JIRA 帐户并提交问题。如果您没有 Red Hat Jira 帐户,则会提示您创建一个帐户。
步骤
- 单击以下链接 以创建 ticket。
- 在 Summary 中输入问题的简短描述。
- 在 Description 中提供问题或功能增强的详细描述。包括一个指向文档中问题的 URL。
- 点 Submit 创建问题,并将问题路由到适当的文档团队。
使开源包含更多 复制链接链接已复制到粘贴板!
红帽致力于替换我们的代码、文档和 Web 属性中有问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
第 1 章 Quarkus 安全架构 复制链接链接已复制到粘贴板!
Quarkus 安全架构提供多个内置身份验证机制,并且高度自定义。在 Quarkus 中保护 HTTP 应用程序的主要机制是 HttpAuthenticationMechanism 接口。
1.1. Quarkus 安全架构概述 复制链接链接已复制到粘贴板!
当客户端发送 HTTP 请求时,Quarkus Security 通过与几个内置核心组件(包括 HttpAuthenticationMechanism、IdentityProvider 和 SecurityIdentityAugmentor )交互来编排安全身份验证和授权。
后续安全验证过程会产生三个结果之一:
- HTTP 请求经过身份验证和授权,并被授予对 Quarkus 应用的访问权限。
-
HTTP 请求身份验证失败,请求者收到特定于身份验证机制的质询,如
401错误、重定向到重新验证的 URL 或某些其他自定义身份验证质询响应。有关挑战响应的实际示例,请参阅 Quarkus 安全提示 和 Tricks 指南。 - HTTP 请求授权失败,请求者会被拒绝访问 Quarkus 应用。
下图显示了 Quarkus 安全架构的详细流程流程:
图 1.1. Quarkus 安全架构和进程流
1.2. Quarkus 安全架构的核心组件 复制链接链接已复制到粘贴板!
1.2.1. HttpAuthenticationMechanism 复制链接链接已复制到粘贴板!
Quarkus Security 使用 HttpAuthenticationMechanism 从 HTTP 请求中提取身份验证凭据,并将它们委派为 IdentityProvider,将凭据转换为 SecurityIdentity。例如,凭据可以来自 Authorization 标头、客户端 HTTPS 证书或 Cookie。
当 Quarkus Security 拒绝身份验证请求时,HttpAuthenticationMechanism 会向客户端返回一个身份验证质询。挑战类型取决于身份验证机制。例如,使用 OIDC OpenID Connect (OIDC)授权代码流机制,会生成一个重定向 URL,客户端会返回到 OpenID Connect 供应商进行验证。
1.2.2. IdentityProvider 复制链接链接已复制到粘贴板!
IdentityProvider 验证身份验证凭据并将其映射到 SecurityIdentity,其具有用户名、角色、原始身份验证凭据和其他属性。
您可以注入每个经过身份验证的用户的 SecurityIdentity 实例,以获取经过身份验证的身份信息。
在其他上下文中,可以具有相同信息或部分信息的其他并行表示,例如,Jakarta REST 的 SecurityContext 或 JsonWebToken 用于 JSON Web 令牌(JWT)。
如需更多信息,请参阅 Quarkus 身份提供程序 指南。
1.2.3. SecurityIdentityAugmentor 复制链接链接已复制到粘贴板!
由于 Quarkus 安全性是可自定义的,例如,您可以将授权角色添加到 SecurityIdentity,并优先选择一个或多个 SecurityAugmentor 实现。
在安全身份验证过程的最终阶段调用 SecurityIdentityAugmentor 的注册实例。如需更多信息,请参阅" 安全提示 和 Tricks"指南中的安全身份自定义 部分。
1.3. 支持的验证机制 复制链接链接已复制到粘贴板!
Quarkus 安全框架支持多种身份验证机制,也可以组合使用。某些支持的验证机制内置在 Quarkus 中,而其他的验证机制则要求您添加扩展。
要了解 Quarkus 中的安全身份验证以及支持的机制和协议,请参阅 Quarkus 指南中的 Quarkus 身份验证机制。
1.4. 主动身份验证 复制链接链接已复制到粘贴板!
在 Quarkus 中默认启用主动身份验证。如果传入请求具有凭证,即使目标页面不需要身份验证,该请求也会始终被验证。如需更多信息,请参阅 Quarkus 主动身份验证 指南。
1.5. Quarkus 安全自定义 复制链接链接已复制到粘贴板!
Quarkus 安全性可自定义。您可以自定义 Quarkus 的以下核心安全组件:
-
HttpAuthenticationMechanism -
IdentityProvider -
SecurityidentityAugmentor
有关自定义 Quarkus 安全的更多信息,包括被动安全性以及如何注册安全供应商,请参阅 Quarkus 安全提示和技巧 指南。
1.6. 参考 复制链接链接已复制到粘贴板!
第 2 章 Quarkus 中的身份验证机制 复制链接链接已复制到粘贴板!
Quarkus 安全框架支持多个身份验证机制,可用于保护应用程序的安全。您还可以组合身份验证机制。
在选择保护 Quarkus 应用程序的身份验证机制前,请查看提供的信息。
2.1. 支持的身份验证机制概述 复制链接链接已复制到粘贴板!
某些支持的验证机制内置在 Quarkus 中,而其他的验证机制则要求您添加扩展。以下部分详细介绍了所有这些机制:
下表将特定的验证要求映射到您可以在 Quarkus 中使用的支持机制:
| 身份验证要求 | 身份验证机制 |
|---|---|
| 用户名和密码 | |
| bearer 访问令牌 | |
| 单点登录(SSO) | |
| 客户端证书 |
如需更多信息,请参阅以下 Token 验证机制比较 表。
2.2. 内置身份验证机制 复制链接链接已复制到粘贴板!
Quarkus Security 提供以下内置身份验证支持:
2.2.1. 基本身份验证(Basic authentication) 复制链接链接已复制到粘贴板!
您可以使用内置的 HTTP 基本身份验证机制来保护 Quarkus 应用程序端点。如需更多信息,请参阅以下文档:
2.2.2. 基于表单的身份验证 复制链接链接已复制到粘贴板!
Quarkus 提供基于表单的身份验证,其的工作方式类似于传统的 Servlet 基于表单的身份验证。与传统的表单身份验证不同,经过身份验证的用户没有存储在 HTTP 会话中,因为 Quarkus 不支持集群的 HTTP 会话。相反,身份验证信息存储在加密的 cookie 中,该 Cookie 可以被共享同一加密密钥的所有群集成员读取。
要应用加密,请添加 quarkus.http.auth.session.encryption-key 属性,并确保您设置的值至少为 16 个字符。使用 SHA-256 对加密密钥进行哈希处理。生成的摘要用作 Cookie 值的 AES-256 加密的密钥。Cookie 包含作为加密值一部分的过期时间,因此集群中的所有节点都必须同步其时钟。一分钟内,如果会话正在使用,则使用更新的到期时间生成一个新的 Cookie。
使用单页应用程序(SPA)时,您通常希望通过删除默认页面路径来避免重定向,如下例所示:
现在,您已禁用了 SPA 的重定向,您必须以编程方式从客户端注销。以下是用于登录 j_security_check 端点并通过销毁 cookie 注销应用的 JavaScript 方法示例。
要从客户端注销 SPA,cookie 必须设置为 quarkus.http.auth.form.http-only-cookie=false,以便您可以销毁 cookie,并可能重定向到您的主页面。
要从服务器的 SPA 注销,可以将 Cookie 设置为 quarkus.http.auth.form.http-only-cookie=true,并使用此示例代码销毁 Cookie。
以下属性可用于配置基于表单的身份验证:
构建时修复的配置属性 - 所有其他配置属性可在运行时覆盖
| 类型 | default | |
|
如果启用了表单身份验证。
环境变量: | 布尔值 |
|
|
后位置。
环境变量: | string |
|
构建时修复的配置属性 - 所有其他配置属性可在运行时覆盖
| 类型 | default | |
|
包含客户端证书通用名称(CN)到角色映射的属性文件。仅在使用
属性文件应该具有
环境变量: | path | |
|
身份验证域
环境变量: | string | |
|
登录页面。可以通过设置
环境变量: | string |
|
|
username 字段名称。
环境变量: | string |
|
|
password 字段名称。
环境变量: | string |
|
|
错误页面。可以通过设置
环境变量: | string |
|
|
如果没有要重新重定向到的保存页面,则要重定向到的登录页面。可以通过设置
环境变量: | string |
|
|
控制用于重定向用户要访问的位置的 Cookie 名称的选项。
环境变量: | string |
|
|
达到不活跃超时时不活动(空闲)超时,Cookie 不会被续订,并强制进行新的登录。
环境变量: |
| |
|
Cookie 在被替换为更新超时的新 Cookie 之前可以如何替换它,也称为"renewal-timeout"。请注意,较小的值会稍微多于服务器负载(因为新的加密 Cookie 将更频繁地生成);但是,较大的值会影响不活动超时,因为在生成 Cookie 时设置了超时。例如,如果将其设置为 10 分钟,并且不活跃超时为 30m,如果用户的最后请求是 Cookie,则实际超时会在最后一次请求后发生 21m,因为仅在生成新 Cookie 时刷新超时。也就是说,服务器端不会跟踪超时;时间戳在 Cookie 本身中经过编码和加密,并且会为每个请求解密并解析。
环境变量: |
| |
|
用于存储持久会话的 Cookie
环境变量: | string |
|
|
会话和位置 Cookie 的 Cookie 路径。
环境变量: | string |
|
|
设置 HttpOnly 属性,以防止通过 JavaScript 访问 Cookie。
环境变量: | 布尔值 |
|
|
会话和位置 Cookie 的 SameSite 属性。
环境变量: |
|
|
|
确定是否启用整个权限集。默认情况下,如果定义了权限集,它会被启用。
环境变量: | 布尔值 | |
|
此权限集链接到的 HTTP 策略。有三个内置策略:allow、deny 和 authentication。可以根据角色的策略定义,扩展也可以添加自己的策略。
环境变量: | string |
必需
|
|
此权限集应用到的方法。如果没有设置,则它们适用于所有方法。请注意,如果请求与任何权限集的路径匹配,但由于未列出方法,不匹配约束,则请求将被拒绝。特定于方法的权限优先于没有设置任何方法的匹配项。这意味着,例如,如果 Quarkus 配置为允许 GET 和 POST 请求发送到 /admin,且没有将 PUT 请求配置为 /admin,则拒绝将 PUT 请求配置为 /admin。
环境变量: | 字符串列表 | |
|
此权限检查应用到的路径。如果路径以 VRF 结尾,则它将被视为路径前缀,否则它将被视为完全匹配。匹配按长度进行,因此最具体的路径匹配具有优先权。如果多个权限集与同一路径匹配,则显式方法匹配优先于没有设置方法的匹配项,否则会应用限制性最强的权限。
环境变量: | 字符串列表 | |
|
特定于路径的验证机制,必须用于验证用户。它需要匹配
环境变量: | string | |
|
表示此策略总是适用于匹配的路径,除了具有获奖路径的策略之外。避免创建多个共享策略,以最大程度降低性能影响。
环境变量: | 布尔值 |
|
|
允许访问此策略保护的资源的角色。默认情况下,允许访问任何经过身份验证的用户。
环境变量: | 字符串列表 |
|
|
根据
环境变量: |
| |
|
如果此策略成功应用,则授予
环境变量: |
| |
|
此策略授予的权限将使用此配置属性指定的
环境变量: | string |
|
要写入持续时间值,请使用标准的 java.time.Duration 格式。如需更多信息,请参阅 Duration#parse ()Java API 文档。
您还可以使用简化的格式,从数字开始:
- 如果该值只是一个数字,则代表以秒为单位。
-
如果值是数字,后跟
ms,则表示时间(毫秒)。
在其他情况下,简化的格式转换为 java.time.Duration 格式进行解析:
-
如果该值是一个数字,后跟
h、m或s,则使用PT前缀。 -
如果该值是一个数字,后跟
d,则前缀为P。
2.2.3. 双向 TLS 身份验证 复制链接链接已复制到粘贴板!
Quarkus 提供 mutual TLS (mTLS)身份验证,以便您可以根据其 X.509 证书验证用户。
要使用此验证方法,您必须首先为应用程序启用 SSL/TLS。如需更多信息,请参阅 Quarkus "HTTP 参考"指南中的支持使用 SSL/TLS 的安全连接 部分。
应用程序接受安全连接后,下一步是将 quarkus.http.ssl.certificate.trust-store-file 属性配置包含应用程序信任的所有证书的名称。指定文件还包括应用程序在客户端(如浏览器或其他服务)时如何询问证书的信息,尝试访问其中一个受保护的资源。
当传入的请求与信任存储中的有效证书匹配时,应用程序可以通过注入 SecurityIdentity 来获取主题,如下所示:
获取主题
您还可以使用以下示例中介绍的代码获取证书:
获取证书
import java.security.cert.X509Certificate; import io.quarkus.security.credential.CertificateCredential; CertificateCredential credential = identity.getCredential(CertificateCredential.class); X509Certificate certificate = credential.getCertificate();
import java.security.cert.X509Certificate;
import io.quarkus.security.credential.CertificateCredential;
CertificateCredential credential = identity.getCredential(CertificateCredential.class);
X509Certificate certificate = credential.getCertificate();
2.2.3.1. 将证书属性映射到角色 复制链接链接已复制到粘贴板!
客户端证书的信息可用于将角色添加到 Quarkus SecurityIdentity。
在检查客户端证书的通用名称(CN)属性后,您可以在 SecurityIdentity 中添加新角色。添加新角色的最简单方法是使用 certificate 属性到角色映射功能。
例如,您可以更新部分中显示的属性,它引入了 Mutual TLS 身份验证,如下所示:
假定假定配置,如果客户端证书的 CN 属性等于 alice 或 bob,则请求会被授权,如果它等于 jdoe,则请求会被禁止。
2.2.3.2. 使用证书属性增强 SecurityIdentity 复制链接链接已复制到粘贴板!
如果自动映射 证书属性到 roles 选项不适合,则始终可以注册 SecurityIdentityAugmentor。自定义 SecurityIdentityAugmentor 可以检查不同客户端证书属性的值,并相应地增强 SecurityIdentity。
有关自定义 SecurityIdentity 的更多信息,请参阅 Quarkus " 安全提示和技巧"指南中的安全身份自定义 部分。
2.3. 其他支持的身份验证机制 复制链接链接已复制到粘贴板!
Quarkus 安全还通过扩展支持以下身份验证机制:
2.3.1. OpenID Connect 身份验证 复制链接链接已复制到粘贴板!
OpenID Connect (OIDC)是一个在 OAuth 2.0 协议之上工作的身份层。OIDC 可让客户端应用程序根据 OIDC 供应商执行的身份验证来验证用户的身份,并检索有关该用户的基本信息。
Quarkus quarkus-oidc 扩展提供了一个被动、可互操作的、启用了多租户的 OIDC 适配器,它支持 Bearer 令牌和授权代码流身份验证机制。Bearer 令牌身份验证机制从 HTTP Authorization 标头中提取令牌。
Authorization Code 流机制将用户重定向到 OIDC 供应商,以验证用户的身份。用户重定向到 Quarkus 后,机制通过交换为 ID、访问和刷新令牌提供的代码来完成身份验证过程。
您可以使用可刷新的 JSON Web 密钥(JWK)集或内省来验证 ID 和访问 JSON Web 令牌(JWT)令牌。但是,不透明(也称为二进制令牌)只能远程内省。
使用 Quarkus OIDC 扩展时,Bearer 令牌和授权代码流验证机制都使用 SmallRye JWT 身份验证来代表 JWT 令牌作为 MicroProfile JWT org.eclipse.microprofile.jwt.JsonWebToken。
2.3.1.1. 用于 OIDC 身份验证的额外 Quarkus 资源 复制链接链接已复制到粘贴板!
有关可用于保护 Quarkus 应用程序的 OIDC 身份验证和授权方法的更多信息,请参阅以下资源:
| OIDC 主题 | Quarkus 信息资源 |
|---|---|
| bearer 令牌身份验证机制 | |
| 授权代码流身份验证机制 | |
| OIDC 和 SAML 身份代理 | |
| 支持 Bearer 令牌身份验证或授权代码流机制的多个租户 | |
| 使用常用的 OpenID Connect 供应商保护 Quarkus | |
| 使用 Keycloak 集中授权 |
要在运行时启用 Quarkus OIDC 扩展,请在构建时设置 quarkus.oidc.tenant-enabled=false。然后,使用系统属性在运行时重新启用它。
有关在多租户 OIDC 部署中管理单个租户配置的更多信息,请参阅"使用 OpenID Connect (OIDC)多租户"指南中的 禁用 租户配置部分。
2.3.1.2. OpenID Connect 客户端和过滤器 复制链接链接已复制到粘贴板!
quarkus-oidc-client 扩展为 OidcClient 提供 OidcClient,用于从支持以下令牌授予的 OpenID Connect 和 OAuth2 供应商中刷新访问令牌:
-
client-credentials -
password -
refresh_token
quarkus-oidc-client-filter 扩展需要 quarkus-oidc-client 扩展。它提供 JAX-RS RESTful Web Services OidcClientRequestFilter,它将 OidcClient 获取的访问令牌设置为 HTTP Authorization 标头的 Bearer scheme 值。此过滤器可以在注入当前 Quarkus 端点的 MicroProfile REST 客户端实现中注册,但它与此服务端点的身份验证要求无关。例如,它可以是一个公共端点,也可以使用 mTLS 进行保护。
在这种情况下,您不需要使用 Quarkus OpenID Connect 适配器来保护 Quarkus 端点。
quarkus-oidc-token-propagation 扩展需要 quarkus-oidc 扩展。它提供 Jakarta REST TokenCredentialRequestFilter,它将 OpenID Connect Bearer 令牌或 Authorization Code Flow 访问令牌设置为 HTTP Authorization 标头的 Bearer scheme 值。此过滤器可以注册到注入当前 Quarkus 端点中的 MicroProfile REST 客户端实现,该端点必须使用 Quarkus OIDC 适配器进行保护。此过滤器可以将访问令牌传播到下游服务。
如需更多信息,请参阅 OpenID Connect 客户端和令牌传播快速启动 和 OpenID Connect (OIDC)和 OAuth2 客户端和过滤器参考指南。
2.3.2. 小的 JWT 身份验证 复制链接链接已复制到粘贴板!
quarkus-smallrye-jwt 扩展提供 MicroProfile JSON Web Token (JWT) 2.1 实现,以及验证签名和加密的 JWT 令牌的多个选项。它将它们表示为 org.eclipse.microprofile.jwt.JsonWebToken。
Quarkus-smallrye-jwt 是 quarkus-oidc Bearer 令牌身份验证机制的替代选择,并使用 Privacy Enhanced Mail (PEM)密钥或 refreshable JWK 密钥集仅验证 JWT 令牌。Quarkus-smallrye-jwt 还提供 JWT 生成 API,可用于轻松创建 签名的、内部签名和加密 的 JWT 令牌。
如需更多信息,请参阅使用 JWT RBAC 指南。
2.4. 在 OpenID Connect、SmallRye JWT 和 OAuth2 身份验证机制之间进行选择 复制链接链接已复制到粘贴板!
使用以下信息来选择适当的令牌身份验证机制来保护 Quarkus 应用程序。
身份验证机制用例列表
-
Quarkus-oidc需要 OpenID Connect 供应商,如 Keycloak,它可以验证 bearer 令牌或使用授权代码流验证最终用户。在这两种情况下,quarkus-oidc需要连接到指定的 OpenID Connect 供应商。 -
如果用户身份验证需要授权代码流,或者您需要支持多个租户,请使用
quarkus-oidc。Quarkus-oidc也可以使用授权代码流和 Bearer 访问令牌来请求用户信息。 -
如果需要验证 bearer 令牌,请使用
quarkus-oidc或quarkus-smallrye-jwt。 -
如果您的 bearer 令牌采用 JSON Web 令牌(JWT)格式,您可以使用前面的列表中的任何扩展。
quarkus-oidc和quarkus-smallrye-jwt支持在 OpenID Connect 提供程序轮转密钥时刷新JsonWebKey(JWK)设置。因此,如果必须避免远程令牌内省,或者供应商不支持,请使用quarkus-oidc或quarkus-smallrye-jwt来验证 JWT 令牌。 -
要远程内省 JWT 令牌,您可以使用
quarkus-oidc通过远程内省验证不透明或二进制令牌。quarkus-smallrye-jwt不支持对不透明或 JWT 令牌的远程内省,而是依赖于通常从 OpenID Connect 供应商检索的本地可用密钥。 -
Quarkus-oidc和quarkus-smallrye-jwt支持 JWT 和不透明令牌注入端点代码中。注入的 JWT 令牌提供有关用户的更多信息。所有扩展都可以将令牌作为主体注入。 -
quarkus-smallrye-jwt支持比quarkus-oidc更多的键格式。Quarkus-oidc只使用属于 JWK 集的 JWK 格式的密钥,而quarkus-smallrye-jwt支持 PEM 密钥。 -
Quarkus-smallrye-jwt处理本地签名、内部签名和加密令牌。相反,虽然quarkus-oidc也可以验证这些令牌,但它将其视为不透明令牌,并通过远程内省进行验证。
架构考虑因素导致您的决定使用不透明或 JSON Web 令牌(JWT)令牌格式。不透明令牌通常比 JWT 令牌更短,但需要大多数令牌关联状态才能在提供程序数据库中维护。不透明令牌是有效的数据库指针。
JWT 令牌比不透明令牌要长。然而,提供商通过将其存储为令牌声明并签名或加密,从而有效地将大多数令牌关联状态委派给客户端。
| 所需功能 | 身份验证机制 | |
|---|---|---|
|
|
| |
| bearer JWT 验证 | 本地验证或内省 | 本地验证 |
| bearer opaque 令牌验证 | 内省 | 否 |
|
刷新 | 是 | 是 |
|
将令牌表示为 | 是 | 是 |
| 将 JWT 注入为 MP JWT | 是 | 是 |
| 授权代码流 | 是 | 否 |
| 多租户 | 是 | 否 |
| 用户信息支持 | 是 | 否 |
| PEM 密钥格式支持 | 否 | 是 |
| secretKey 支持 | 否 | JSON Web 密钥(JWK)格式 |
| 内部签名和加密令牌 | 内省 | 本地验证 |
| 自定义令牌验证 | 否 | 带有注入的 JWT 解析器 |
| JWT 作为 Cookie 支持 | 否 | 是 |
2.5. 合并身份验证机制 复制链接链接已复制到粘贴板!
如果不同的源提供用户凭证,您可以组合身份验证机制。例如,您可以组合内置的 Basic 和 Quarkus quarkus-oidc Bearer 令牌身份验证机制。
您不能组合 Quarkus quarkus-oidc Bearer 令牌和 smallrye-jwt 身份验证机制,因为这两种机制都试图验证从 HTTP Bearer 令牌身份验证方案中提取的令牌。
2.5.1. 特定于路径的身份验证机制 复制链接链接已复制到粘贴板!
以下配置示例演示了如何为给定请求路径强制使用单一可选择的验证机制:
确保 auth-mechanism 属性的值与 HttpAuthenticationMechanism 支持的身份验证方案匹配,如 basic、bearer 或 form。
2.6. 主动身份验证 复制链接链接已复制到粘贴板!
在 Quarkus 中默认启用主动身份验证。这意味着,如果传入的请求具有凭证,则请求将始终进行身份验证,即使目标页面不需要身份验证。如需更多信息,请参阅 Quarkus 主动身份验证 指南。
2.7. 参考 复制链接链接已复制到粘贴板!
第 3 章 用户身份供应商 复制链接链接已复制到粘贴板!
在 Quarkus 安全框架中,身份提供程序通过验证用户身份在身份验证和授权中发挥关键作用。IdentityProvider 创建一个 SecurityIdentity 实例,用于在用户身份验证过程中验证和授权对 Quarkus 应用的访问请求。
IdentityProvider 将 HttpAuthenticationMechanism 提供的身份验证凭据转换为 SecurityIdentity 实例。
有些扩展(如 OIDC、OAuth2 和 SmallRye JWT )具有特定于支持的身份验证流的内联 IdentityProvider 实现。例如,quarkus-oidc 使用自己的 IdentityProvider 将令牌转换为 SecurityIdentity 实例。
如果使用基于 Basic 或表单的身份验证,您必须添加一个 IdentityProvider 个实例,才能将用户名和密码转换为 SecurityIdentity 实例。
要开始使用 Quarkus 中的安全性,请考虑将 Quarkus 内置基本 HTTP 身份验证与 Jakarta Persistence 身份提供程序相结合,以启用基于角色的访问控制(RBAC)。
有关基本身份验证、其机制和相关身份提供程序的更多信息,请参阅以下资源:
第 4 章 主动身份验证 复制链接链接已复制到粘贴板!
了解如何在 Quarkus 中管理主动身份验证,包括自定义设置和处理异常。获取各种应用程序场景的实际见解和策略。
在 Quarkus 中默认启用主动身份验证。它确保所有带有凭证的传入请求都经过身份验证,即使目标页面不需要身份验证。因此,带有无效凭证的请求也会被拒绝,即使目标页面是公共的。
只有在目标页面需要它时,才能关闭此默认行为。要关闭主动身份验证,以便仅在目标页面需要它时进行身份验证,请按如下所示修改 application.properties 配置文件:
quarkus.http.auth.proactive=false
quarkus.http.auth.proactive=false
如果您关闭主动身份验证,则身份验证过程仅在请求身份时运行。可以请求身份,因为需要用户进行身份验证的安全规则,或者需要编程访问当前身份。
如果使用主动身份验证,则访问 SecurityIdentity 是一个阻塞操作。这是因为,身份验证可能还必须发生,并且访问 SecurityIdentity 可能需要对外部系统(如数据库)调用,这可能会阻止操作。对于阻塞应用程序,这不是一个问题。但是,如果您在被动应用程序中禁用了身份验证,此操作会失败,因为您无法在 I/O 线程中阻止操作。要临时解决这个问题,您需要 @Inject 一个 io.quarkus.security.identity.CurrentIdentityAssociation 实例,并调用 Uni<SecurityIdentity> getDeferredIdentity (); 方法。然后,您可以订阅生成的 Uni,以便在身份验证完成后获得通知,身份可用。
您仍然可以从以 @RolesAllowed 、@Authenticated、,因为身份验证已经发生。如果 路由响应同步,则同样适用于 Reactive 路由。
@Authenticated 或通过相应配置授权检查标注的端点,在 RESTEasy Reactive 中异步访问 SecurityIdentity getIdentity ()
禁用主动身份验证后,如果未同步返回值的安全方法,则 CDI Bean 上使用 的标准安全注解 在 I/O 线程上无法正常工作。这个限制源自这些方法访问 SecurityIdentity 的必要性。
以下示例定义了 HelloResource 和 HelloService。任何对 /hello 的 GET 请求在 I/O 线程上运行,并抛出 BlockingOperationNotAllowedException 异常。
修复示例的方法多:
-
通过注解带有
@Blocking的hello端点,切换到 worker 线程。 -
使用被动或异步数据类型更改
sayHello方法返回类型。 -
将
@RolesAllowed注释移到端点。这可能是最安全的方法之一,因为从端点方法访问SecurityIdentity不是阻塞操作。
4.1. 自定义身份验证异常响应 复制链接链接已复制到粘贴板!
您可以使用 Jakarta REST ExceptionMapper 捕获 Quarkus 安全身份验证异常,如 io.quarkus.security.AuthenticationFailedException。例如:
有些 HTTP 身份验证机制必须处理身份验证例外,才能创建正确的身份验证质询。例如: io.quarkus.oidc.runtime.CodeAuthenticationMechanism,它管理 OpenID Connect (OIDC)授权代码流身份验证,必须构建正确的重定向 URL 并设置状态 cookie。因此,避免使用自定义异常映射器来自定义此类机制抛出的身份验证异常。相反,一种安全的方法是确保启用主动身份验证并使用 Vert.x HTTP 路由失败处理程序。这是因为事件进入具有正确响应状态和标头的处理程序。然后,您必须只自定义响应,例如:

