当前位置: 首页 > news >正文

Quarkus OIDC 安全链路时序图

  • 请求进入
  • OIDC 验证
  • SecurityIdentityAugmentor
  • ContainerRequestFilter
  • Resource 方法
  • ContainerResponseFilter
  • 响应返回

🖼️ 时序图(文字版)

┌─────────────────────────────┐
│         HTTP 请求           │
└──────────────┬──────────────┘│▼┌───────────────────┐│ OIDC 验证 (token) ││  构建 SecurityIdentity │└─────────┬─────────┘│▼┌───────────────────────────────┐│ SecurityIdentityAugmentor      ││ (增强身份 / 单点登录检查等) │└─────────────┬─────────────────┘│▼┌───────────────────────────────┐│ ContainerRequestFilter         ││ (请求级拦截,能拿到identity)│└─────────────┬─────────────────┘│▼┌───────────────────┐│  Resource 方法调用 │└─────────┬─────────┘│▼┌───────────────────────────────┐│ ContainerResponseFilter        ││ (统一返回值/异常包装)        │└─────────────┬─────────────────┘│▼
┌─────────────────────────────┐
│         HTTP 响应           │
└─────────────────────────────┘

1️⃣ Demo 项目结构

最小可运行的 Quarkus Demo,包含以下三个类:

  • SecurityIdentityAugmentor → 增强身份,打印日志。
  • ContainerRequestFilter → 请求级别过滤器,打印日志。
  • ContainerResponseFilter → 响应级别过滤器,打印日志。

这样你启动应用、访问一个 REST 接口,就能看到日志执行顺序。

src└── main└── java└── com.example.demo├── LoggingIdentityAugmentor.java├── LoggingRequestFilter.java├── LoggingResponseFilter.java└── HelloResource.java

2️⃣ 代码示例

2.1 SecurityIdentityAugmentor

package com.example.demo;import io.quarkus.security.identity.SecurityIdentity;
import io.quarkus.security.identity.SecurityIdentityAugmentor;
import io.quarkus.security.identity.request.SecurityIdentityAugmentorRequest;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.CompletableFuture;@ApplicationScoped
public class LoggingIdentityAugmentor implements SecurityIdentityAugmentor {@Overridepublic CompletionStage<SecurityIdentity> augment(SecurityIdentity identity,SecurityIdentityAugmentorRequest request) {System.out.println(">>> [Augmentor] SecurityIdentityAugmentor executed, user = "+ identity.getPrincipal().getName());return CompletableFuture.completedFuture(identity);}
}

2.2 ContainerRequestFilter

package com.example.demo;import io.quarkus.security.identity.SecurityIdentity;
import jakarta.annotation.Priority;
import jakarta.inject.Inject;
import jakarta.ws.rs.Priorities;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.ext.Provider;@Provider
@Priority(Priorities.AUTHENTICATION + 10) // 在认证之后执行
public class LoggingRequestFilter implements ContainerRequestFilter {@InjectSecurityIdentity identity;@Overridepublic void filter(ContainerRequestContext requestContext) {System.out.println(">>> [RequestFilter] Executed for path = " + requestContext.getUriInfo().getPath()+ ", user = " + identity.getPrincipal().getName());}
}

2.3 ContainerResponseFilter

package com.example.demo;import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerResponseFilter;
import jakarta.ws.rs.ext.Provider;
import java.io.IOException;@Provider
public class LoggingResponseFilter implements ContainerResponseFilter {@Overridepublic void filter(ContainerRequestContext requestContext,ContainerResponseContext responseContext) throws IOException {System.out.println(">>> [ResponseFilter] Executed, status = " + responseContext.getStatus());}
}

2.4 REST Resource

package com.example.demo;import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;@Path("/hello")
public class HelloResource {@GETpublic Response hello() {System.out.println(">>> [Resource] Hello endpoint executed");return Response.ok("Hello from Quarkus!").build();}
}

3️⃣ 运行效果

启动应用后,访问:

curl http://localhost:8080/hello

日志输出顺序应当是:

>>> [Augmentor] SecurityIdentityAugmentor executed, user = <user>
>>> [RequestFilter] Executed for path = hello, user = <user>
>>> [Resource] Hello endpoint executed
>>> [ResponseFilter] Executed, status = 200

这样,你就能清楚看到 Augmentor → RequestFilter → Resource → ResponseFilter 的调用顺序。


✅ 总结

  • SecurityIdentityAugmentor → 在 认证阶段(构建 SecurityIdentity 时执行),比 ContainerRequestFilter 更早。
  • ContainerRequestFilter → 在 认证完成后、进入 Resource 前执行。
  • ContainerResponseFilter → 在 Resource 方法执行完后,返回给客户端前执行。
http://www.dtcms.com/a/352645.html

相关文章:

  • git换行行为差异简述;.editorconfig换行行为简述
  • 打工人日报#20250826
  • 【PS实战】制作hello标志设计:从选区到色彩填充的流程(大学作业)
  • springboot启动的时候,只打印logo,不打印其他的任何日志的原因
  • 【ElasticSearch】数据同步
  • 人形机器人的“奥运会“:宇树科技领跑,动捕技术成训练关键
  • git submodule的基本使用
  • 数据与端点安全 (Protect data and apps)
  • 利用 Python 爬虫按关键字搜索 1688 商品详情 API 返回值说明(代码示例)实战指南
  • 从零开始配置前端环境及必要软件安装
  • 技术总结:AArch64架构下Jenkins Agent(RPM容器编译节点)掉线问题分析与排查
  • 基于用户行为分析的精确营销系统
  • 【java并发编程】--cas和synchronized
  • openEuler Embedded 的 Yocto入门 : 2. 构建一个Hello,world!
  • PWM控制实现呼吸灯
  • 基于CentOS7:Linux服务器的初始化流程
  • 基于51单片机的指纹红外密码电子锁
  • 【Elasticsearch】k-NN 搜索深度解析:参数优化与分数过滤实践
  • Pascal使用TMediaPlayer播放MIDI文件时的错误
  • 红外遥控模块
  • 逻辑流图、作业图、执行图、物理图
  • 嵌入式软件移植
  • 【制作100个Unity游戏】从零开始构建类《月圆之夜》《杀戮尖塔》的卡牌游戏(附带项目源码)
  • Windows远程协助安全配置与使用限制
  • STM32G4 SVPWM VF开环强拖电机
  • 2026 届最新大数据专业毕设选题推荐,毕业设计题目汇总
  • 达索 Enovia 许可管理技术白皮书:机制解析与智能优化实践
  • 段式存储、页式存储、段页式存储:三种内存管理策略的演进与权衡
  • PyTorch生成式人工智能——PatchGAN详解与实现
  • Docker实战系列:使用Docker部署YouTrack项目管理系统