Quarkus 自定义授权拦截器

2024-01-12

我有一个 Quarkus 微服务,使用 quarkus-oidc 和 quarkus-keycloak-authorization 扩展通过 Keycloak 进行身份验证和授权。

我需要另外实现以下两个请求拦截器/过滤器:

  1. 任何身份验证逻辑启动之前的过滤器。这是将令牌从查询参数复制到标头(Web 套接字所需)。该过滤器的优先级应该是什么?
  2. 具有自定义授权逻辑的过滤器。这应该在所有身份验证和 keycloak 授权逻辑之后执行,但在 API 执行之前执行?该过滤器的优先级应该是什么?

我尝试将 @Priority(Interceptor.Priority.PLATFORM_BEFORE) 和 @Prematching 也放入我的过滤器中,但即使是在 OIDC 启动后也会调用它。

另外,有什么方法可以支持扩展 quarkus oidc 逻辑以包含自定义代码吗?

我无法获得 oidc 和 keycloak-auth 拦截器的优先级(了解这些可以帮助我确定过滤器的优先级)。请帮忙。


从 quarkus google groups 得到了答案。

对于#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(); 
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Quarkus 自定义授权拦截器 的相关文章

随机推荐

  • Terraform,如何在现有资源上运行配置程序?

    我的问题与这个 github 帖子类似 https github com hashicorp terraform issues 745 https github com hashicorp terraform issues 745 这也与我
  • 我可以检查指针是否由 malloc/calloc/realloc 分配吗? [复制]

    这个问题在这里已经有答案了 我想知道是否可以检查传递给函数的指针是否由 malloc calloc realloc 分配 int main struct something o struct something a a malloc siz
  • Spark 如何使用图像格式读取我的图像?

    这可能是一个愚蠢的问题 但我无法弄清楚 Spark 如何使用spark read format image load 争论 导入我的图像后 它给出以下内容 gt gt gt image df select image height imag
  • 一个存储库中的多个微服务

    我对微服务和存储库有疑问 我们是一个小团队 5 人 我们在微服务中创建新项目 我们项目中预期的微服务应用程序在 10 15 个之间 我们正在考虑为所有微服务建立一个存储库 其结构如下 app1 app2 app3 script sh scr
  • 来自控制台的 ActionCable.server.broadcast 始终返回 0

    我试图让 actioncable 工作 但是当我在 Rails 控制台中发送 ActionCable server broadcast discussion asdf true 时 它总是返回 0 我已经在cable yml 中运行并配置了
  • 如何在 macOS 10.14 上重置 HIDIdleTime

    在过去的几天里 我一直在尝试编写一个应用程序来重置IORegistry gt IOHIDSystem gt HIDIdleTime入口 最终目标是防止其他读取该值的应用程序将用户标记为空闲 这不仅与电源管理或防止睡眠有关 假设沙箱已禁用并且
  • 如何判断我的页面选项卡应用程序安装在哪个 Facebook 页面上 [重复]

    这个问题在这里已经有答案了 可能的重复 如何查明哪个主页安装了我的 Facebook Canvas 应用程序 http facebook stackoverflow com questions 5587784 how can i find
  • Python 字节码在 CPython 中运行究竟如何?

    我试图了解 Python 是如何工作的 因为我一直在使用它 据我了解 当您运行 python script py 之类的东西时 脚本会转换为字节码 然后解释器 VM CPython 实际上只是一个 C 程序 读取 python 字节码并相应
  • 提取最后一次出现模式 C# 后的所有字符

    字符串具有以下模式 1 0 0 0 1 0 0 1 1 0 0 2 我正在寻找一个代码 它将读取最后创建的字符串并将最后一个数字增加 1 并将其保存为新字符串 我该怎么做 此致 Magic 如果您的意图是始终获取特定字符之后的最后一个子字符
  • 在 SYB 中匹配更高种类的类型

    一般来说 我想知道是否有一种方法可以编写一个通用折叠来概括应用一个函数forall键入如下 f forall a Data D a gt D a gt b 给定某种数据类型D为此instance Data D a 可能有限制a 具体来说 考
  • 如何使用JavaScript判断目录中是否存在文件?

    如何使用javascript判断目录中是否存在文件 如果它在服务器上 你可以做一个HTTP头 http www w3 org Protocols rfc2616 rfc2616 sec9 html sec9 4通过 Ajax 请求 并查看
  • PhpStorm v2017.3.4 与 Codeception v2.4.0 不兼容

    我正在努力使代码接收与 PhpStorm 一起工作 我已经设置了 CLI 解释器 我还设置了 Codeception 这是 Codeception 的配置 当我从 PhpStorm 运行测试时 我收到以下信息 在左侧 以及右侧的文字 Tes
  • 实现不同类型数组集合的更好方法

    我正在寻找 C 中的半通用数据结构来存储不同整数和浮点类型的数组 在某些情况下 整数是位字段 其中每个位都同等重要 并且不能容忍精度损失 由于 C 类型系统和我对 C 的不熟练 我发现这既困难又混乱 项目 Ethercat周期性数据包到达并
  • 使用 AppCompat 时如何更改 ActionBar 标题字体

    我想将自定义字体应用于 ActionBar 上显示的应用程序标题 以前我没有使用任何支持库和这个解决方案 int titleId getResources getIdentifier action bar title id android
  • 如何创建/在哪里获取多个实例的 Wix Bootstrapper

    我目前正在学习如何使用 WiX 创建 msi 安装程序 但似乎遇到了困难 当我创建一个包含单个环境所需的所有内容的 MSI 时 一切都很好 我有功能和组件 并且可以安装我的 MSI 现在我正处于想要将其转换为 SQL Server 样式安装
  • R 中邻居的空间数据/计算指标

    我有 xBin yBin value 形式的二维空间数据 例如 DT data table x c rep 1 3 rep 2 3 rep 3 3 y rep c 1 2 3 3 value 100 c 1 9 对于每个垃圾箱 我想计算所有
  • 从 JS 文件中获取 Vue

    我对现代前端开发工具还很陌生 我安装了 Nodejs 和 NPM 下载了一些软件包 例如 jquery 并且一切正常 然后我安装了 Webpack 第 2 版 我创建了这个演示配置文件 module exports entry entry
  • 如何实现四个 i8 元素组的高效 _mm256_madd_epi8 点积?

    Intel 提供了一个名为 mm256 madd epi16 的 C 风格函数 基本上 m256i mm256 madd epi16 m256i a m256i b 将 a 和 b 中的压缩有符号 16 位整数相乘 生成中间有符号 32 位
  • 如何同步远程服务器数据库与本地数据库

    我想在期间获取从远程服务器数据库到本地数据库的单个表的所有详细信息页面加载事件或其他一些好的方法 应该作为后端进程发生 任何人都可以帮助我解决这个问题 1 在桌面和 Web 应用程序中创建的单个应用程序 2 当用户在桌面应用程序中注册新客户
  • Quarkus 自定义授权拦截器

    我有一个 Quarkus 微服务 使用 quarkus oidc 和 quarkus keycloak authorization 扩展通过 Keycloak 进行身份验证和授权 我需要另外实现以下两个请求拦截器 过滤器 任何身份验证逻辑启