You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Reactive Spring Security应用中Mono订阅无值发射,认证验证方法未执行

问题分析与解决
  • 问题根源:你直接在控制器方法里手动调用subscribe(),但ReactiveSecurityContextHolder的SecurityContext是绑定到当前请求的Reactor上下文中的。手动订阅会脱离这个上下文,导致Mono无法获取到认证信息,自然不会触发validate方法。
  • 响应式编程中,控制器方法不能用void返回值,也不能手动订阅流,必须让Spring框架来管理整个流的生命周期,这样才能保证上下文的正确传递。

修正后的代码示例

@Controller
public class TestController {

    // 返回Mono<Void>让Spring管理流的生命周期
    public Mono<Void> test() {
        return ReactiveSecurityContextHolder.getContext()
                .map(SecurityContext::getAuthentication)
                .doOnNext(this::validate) // 用doOnNext处理认证信息,而非手动subscribe
                .then(); // 转换为Mono<Void>表示操作完成
    }

    private void validate(Authentication authentication) {
        System.out.println(authentication.getPrincipal().getName());
    }
}

关键要点

  • 控制器方法返回响应式类型(如Mono<Void>),而不是void,这样Spring能绑定请求上下文到流中。
  • 使用doOnNext、map等操作符处理流中的数据,不要手动调用subscribe(),让Spring负责订阅和上下文传递。
  • 确保请求确实经过了Spring Security的认证流程,否则SecurityContext本身就是空的,Mono也不会发射值。

内容的提问来源于stack exchange,提问作者jbabu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:51