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

Spring Boot 3升级后手动认证用户失效问题求助

Spring Boot 3 + Vaadin 自定义认证后SecurityContext丢失问题解决

问题原因

Spring Boot 3升级后,Spring Security的SecurityContext持久化逻辑发生变化,默认的SecurityContextRepository会在请求结束后清理上下文。而Vaadin基于长连接/推送的请求模型,手动设置的Authentication如果未被持久化到HttpSession,后续操作时上下文会被重置为AnonymousAuthenticationToken。

解决方法

  • 手动持久化SecurityContext到Session
    借助Vaadin提供的原生请求对象,调用SecurityContextRepository的saveContext方法,将认证上下文持久化:

    // 构建并设置认证上下文
    SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
    securityContext.setAuthentication(yourAuthenticationToken);
    SecurityContextHolder.setContext(securityContext);
    
    // 获取Vaadin当前请求的原生Http对象
    VaadinRequest vaadinRequest = VaadinRequest.getCurrent();
    HttpServletRequest request = (HttpServletRequest) vaadinRequest.getNativeRequest();
    HttpServletResponse response = (HttpServletResponse) vaadinRequest.getNativeResponse();
    
    // 注入SecurityContextRepository后执行保存
    securityContextRepository.saveContext(securityContext, request, response);
    

    这一步能确保认证信息被存入HttpSession,后续Vaadin请求会自动加载该上下文。

  • 调整SecurityContextHolder线程策略
    若涉及异步操作或Vaadin推送场景,线程切换可能导致上下文丢失,可将线程策略设为可继承:

    static {
        SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
    }
    

    在启动类或配置类中添加上述静态代码块即可。

  • 使用Vaadin官方Spring Security集成
    升级到Vaadin 24+(对应Spring Boot 3),引入vaadin-spring-security依赖,使用@EnableVaadinSecurity注解开启官方集成。官方实现会自动处理Vaadin请求中的认证上下文同步,避免手动管理的漏洞。

  • 排查上下文清理逻辑
    检查SecurityContextPersistenceFilter的执行顺序,确保它不会在Vaadin请求处理完成前清理上下文。必要时可自定义过滤器,对Vaadin路径(如/VAADIN/**、/frontend/**)跳过上下文清理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:47:19