SpringSecurity和Flux同时使用报未认证问题

问题描述

当在项目中使用SpringSecurity时,如果controller层返回的是flux的流,那么前端请求就会抛出AuthorizationDeniedException异常。

一开始断点调试只是发现AuthorizationFilter过滤器走了两次,第一次正常通过然后springsecurity会清理认证信息导致第二次走过滤器时被判定为未认证于是报错。

一开始在网上看没有有现成的解决方案,但谁知找了五六个都要开会员,于是一怒之下怒了一下,分享出来。

报错原理

正常的springmvc流程应该是:请求-> 过滤器 -> DispatcherServlet -> 执行目标方法 -> 返回->清理SpringSecurity认证缓存

当在servlet中返回flux流式数据时流程大概是这样:请求 -> 过滤器 -> DispatcherServlet -> 执行目标方法 -> 返回flux响应并保存挂起 -> 清理SpringSecurity认证缓存 -> 数据准备好 -> 过滤器 -> DispatcherServlet -> 找到对应挂起的flux往里面塞数据 -> 前端持续接收数据

可以看到问题就出在执行目标方法只是放回流,但是流中数据还没结束。然后往流里塞数据还是得走DispatcherServlet,走servlet就会触发过滤器,就会导致认证异常。

ps: 可能有人会注意到,我的程序明明也有JWT过滤器为啥第二次不重新走JWT过滤器重新认证一遍。原因是过滤器也是有类型的,有的只处理同步请求,有的只处理异步请求,有的都可以处理,其中JWT过滤器是你自己编写的,默认只能处理同步请求,而AuthorizationFilter过滤器同步异步都会处理。

解决办法

方法一

这个方法我觉得是最简单的,就是判断如果是异步请求就不走SpringSecurity的过滤器链(应为SpringSecurity版本不同,所以可能你的配置类的属性和方法可能和我有区别,如果发现爆红,可以去把你的版本发给AI,问下AI该如何配置异步不走SpringSecurity过滤器)

java 复制代码
httpSecurity
        // 核心:忽略异步派发请求(解决二次校验)
        .securityMatcher(serverWebExchange -> {
            // 如果是 异步派发 请求 → 不进入Security过滤器
            boolean isAsync = serverWebExchange.isAsyncStarted()
                    || serverWebExchange.getDispatcherType() ==                 jakarta.servlet.DispatcherType.ASYNC;
            return !isAsync;
        })

我 自己试了一下,一共是不会影响普通方法的认证

方法二

重写AuthorizationFilter过滤器,在其中判断是否是异步请求,然后放行。

PS:如果本文的方法不可以,建议还是将你的版本和问题简单描述给AI,由AI给你答案。应为我在网上也搜了一些,要不然就是要钱要不然就是直接全部放行。

相关推荐
·薯条大王8 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
fthux10 小时前
装闭 RenoPit 源码解析(04):装修图纸和合同文件上传处理流程
人工智能·ai·开源·github·open source·renopit
ZJH__GO11 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆11 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光11 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林11 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu12 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
运维开发王义杰13 小时前
DefectDojo 里的 curl 高危漏洞修不修?剖析 C/C++ 依赖陷阱与 Web3 真实攻防
ai
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官14 小时前
Sa-Token和Spring Security对比
java·后端·spring