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
@Path("basic")
public String basicAuthMechanism() {
return "basic";
}
@GET
@RolesAllowed("admin")
@AuthorizationCodeFlow
@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
quarkus.http.auth.permission.roles1.policy=roles1
quarkus.http.auth.permission.roles1.methods=GET