2.5. 组合身份验证机制
如果不同的源提供用户凭证,您可以组合身份验证机制。例如,您可以组合内置的 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"; } }
身份验证机制^ | 注解 |
---|---|
基本身份验证机制 |
|
基于表单的验证机制 |
|
双向 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.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