Spring Boot 3升级后手动认证用户失效问题求助
问题原因
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

