Spring Boot 3与Vaadin 24安全过滤器链配置引发403问题求助
解决方案
你的问题源于Spring Security 6(Spring Boot 3.x配套版本)的请求匹配规则变化,以及Vaadin 24的核心资源/请求未被Spring Security放行,同时默认启用的CSRF保护拦截了Vaadin的通信请求。调整配置如下:
修改SecurityFilterChain配置
@Bean SecurityFilterChain filterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception { http .authorizeHttpRequests(authorize -> authorize // 放行Vaadin客户端静态资源(JS/CSS等) .requestMatchers(mvc.pattern("/VAADIN/**")).permitAll() // 放行Vaadin核心UI通信请求(UIDL) .requestMatchers(mvc.pattern("/**").queryParam("v-r", "uidl")).permitAll() // 放行登录页、错误页、H2控制台(修复路径的横杠问题) .requestMatchers(mvc.pattern("/login"), mvc.pattern("/error"), mvc.pattern("/h2-console/**")).permitAll() // 其余所有请求需认证 .anyRequest().authenticated() ) .saml2Login(saml2 -> { // 保留原有SAML配置 }) // 配置CSRF忽略Vaadin相关请求(Vaadin自身已处理CSRF) .csrf(csrf -> csrf .ignoringRequestMatchers( mvc.pattern("/VAADIN/**"), mvc.pattern("/**").queryParam("v-r", "uidl"), mvc.pattern("/push/**") // 若使用Vaadin推送功能则添加 ) ); return http.build(); }
关键调整说明
- 放行Vaadin静态资源:Vaadin 24的客户端资源(如框架JS、主题样式)都放在
/VAADIN/**路径下,必须放行才能让前端正常加载,否则会返回403。 - 放行UIDL请求:
?v-r=uidl是Vaadin客户端与服务器同步UI状态的核心请求,必须允许通过,否则页面无法交互。 - 修复H2控制台路径:你升级后的配置写错了路径(
/h2console/**改为/h2-console/**),不修正的话H2控制台也会无法访问。 - CSRF适配:Spring Boot 3.x默认启用CSRF保护,但Vaadin自身有独立的CSRF防护机制,因此需要让Spring Security忽略Vaadin相关请求的CSRF校验,避免因令牌缺失导致403。
内容的提问来源于stack exchange,提问作者supernicky
相关产品推荐
相关产品推荐

