Quarkus 自定义授权拦截器
Quarkus Custom authorization interceptors
我有一个 Quarkus 微服务使用 quarkus-oidc 和 quarkus-keycloak-authorization 扩展通过 Keycloak 进行身份验证和授权。
我需要另外实现以下两个请求interceptors/filters:
- 任何身份验证逻辑启动之前的过滤器。这是将令牌从查询参数复制到 header(网络套接字需要)。此过滤器的优先级应该是什么?
- 具有自定义授权逻辑的过滤器。这应该在所有身份验证和密钥斗篷授权逻辑之后但在 API 执行之前执行?此过滤器的优先级应该是什么?
我尝试将@Priority(Interceptor.Priority.PLATFORM_BEFORE) 和@Prematching 也放入我的过滤器中,但即使是在 OIDC 启动后也会调用它。
此外,有什么方法可以支持扩展 quarkus oidc 逻辑以包含自定义代码吗?
我无法获得 oidc 和 keycloak-auth 拦截器的优先级(了解这些可以帮助我确定过滤器的优先级)。请帮忙。
从 quarkus google 组得到答案。
对于#2,具有任何优先级(不应该是@Prematching)的ContainerRequestFilter 将达到目的。
其他选项是自定义 HttpSecurityPolicy。这将在身份验证后调用。
package org.acme.security.keycloak.authorization;
import javax.enterprise.context.ApplicationScoped;
import org.jboss.logging.Logger;
import io.quarkus.security.identity.SecurityIdentity;
import io.smallrye.mutiny.Uni;
import io.vertx.ext.web.RoutingContext;
@ApplicationScoped
public class SecurityHandler implements io.quarkus.vertx.http.runtime.security.HttpSecurityPolicy
{
@Override
public Uni<CheckResult> checkPermission(RoutingContext request, Uni<SecurityIdentity> identity, AuthorizationRequestContext requestContext)
{
Logger.getLogger(LoggingFilter.class).infof("================ custom permission");
return Uni.createFrom().item(CheckResult.PERMIT);
}
}
对于#1,我们可以使用 Vertx @RouteFilter
示例过滤器:
只需注意优先级。优先级越高,最先调用。
package org.acme.security.keycloak.authorization;
import io.quarkus.vertx.web.RouteFilter;
import io.vertx.ext.web.RoutingContext;
public class WSAuthFilter
{
@RouteFilter(1000)
void myFilter(RoutingContext rc) {
rc.request().headers().add("Authorization", rc.request().query());
rc.next();
}
}
我有一个 Quarkus 微服务使用 quarkus-oidc 和 quarkus-keycloak-authorization 扩展通过 Keycloak 进行身份验证和授权。
我需要另外实现以下两个请求interceptors/filters:
- 任何身份验证逻辑启动之前的过滤器。这是将令牌从查询参数复制到 header(网络套接字需要)。此过滤器的优先级应该是什么?
- 具有自定义授权逻辑的过滤器。这应该在所有身份验证和密钥斗篷授权逻辑之后但在 API 执行之前执行?此过滤器的优先级应该是什么?
我尝试将@Priority(Interceptor.Priority.PLATFORM_BEFORE) 和@Prematching 也放入我的过滤器中,但即使是在 OIDC 启动后也会调用它。
此外,有什么方法可以支持扩展 quarkus oidc 逻辑以包含自定义代码吗?
我无法获得 oidc 和 keycloak-auth 拦截器的优先级(了解这些可以帮助我确定过滤器的优先级)。请帮忙。
从 quarkus google 组得到答案。
对于#2,具有任何优先级(不应该是@Prematching)的ContainerRequestFilter 将达到目的。
其他选项是自定义 HttpSecurityPolicy。这将在身份验证后调用。
package org.acme.security.keycloak.authorization;
import javax.enterprise.context.ApplicationScoped;
import org.jboss.logging.Logger;
import io.quarkus.security.identity.SecurityIdentity;
import io.smallrye.mutiny.Uni;
import io.vertx.ext.web.RoutingContext;
@ApplicationScoped
public class SecurityHandler implements io.quarkus.vertx.http.runtime.security.HttpSecurityPolicy
{
@Override
public Uni<CheckResult> checkPermission(RoutingContext request, Uni<SecurityIdentity> identity, AuthorizationRequestContext requestContext)
{
Logger.getLogger(LoggingFilter.class).infof("================ custom permission");
return Uni.createFrom().item(CheckResult.PERMIT);
}
}
对于#1,我们可以使用 Vertx @RouteFilter
示例过滤器:
只需注意优先级。优先级越高,最先调用。
package org.acme.security.keycloak.authorization;
import io.quarkus.vertx.web.RouteFilter;
import io.vertx.ext.web.RoutingContext;
public class WSAuthFilter
{
@RouteFilter(1000)
void myFilter(RoutingContext rc) {
rc.request().headers().add("Authorization", rc.request().query());
rc.next();
}
}