Vaadin 24拦截REST接口请求,配置专属Security仍无效
解决Vaadin 24 + Spring Boot 3.2.0 Webflux环境下REST接口被Security拦截的问题
核心问题:误用Servlet Security配置在Webflux环境
你当前的RestSecurityConfig使用的是Servlet体系的HttpSecurity,但Webflux项目依赖的是Reactive Security(基于ServerHttpSecurity),两者属于完全独立的安全配置体系,导致你的REST配置无法生效,请求被Vaadin的Servlet Security配置拦截。
解决步骤
1. 替换为Webflux的Reactive Security配置
将REST专属的Security配置改为Reactive版本,确保它能在Webflux环境中被正确加载:
@Configuration @Order(1) // 优先级高于Vaadin的配置(默认Order=100) public static class RestSecurityConfig { @Bean public SecurityWebFilterChain restSecurityFilterChain(ServerHttpSecurity http) { // 限定此配置仅处理/api/**路径 http.securityMatcher(ServerWebExchangeMatchers.pathMatchers("/api/**")) // REST接口无需CSRF保护,直接禁用 .csrf(ServerHttpSecurity.CsrfSpec::disable) // 允许所有/api/**请求通过 .authorizeExchange(exchanges -> exchanges.anyExchange().permitAll() ); return http.build(); } }
2. 移除Servlet MVC相关的Bean
删除mvcHandlerMappingIntrospector这个Bean,它是Servlet MVC体系的组件,在Webflux环境中不仅无用,还可能引发配置冲突。
3. 调整Vaadin Security配置的范围
确保Vaadin的Security配置仅处理自身相关路径,避免与REST路径重叠:
@Configuration @Order(100) public class VaadinSecurityConfig extends VaadinWebSecurity { @Override protected void configure(HttpSecurity http) throws Exception { // 保留Vaadin默认安全配置 super.configure(http); // 限定Vaadin配置仅处理自身核心路径 http.securityMatcher("/", "/VAADIN/**", "/login/**", "/logout/**", "/register/**"); // 明确放行/api/**路径(双重保险) http.authorizeHttpRequests(auth -> auth.requestMatchers("/api/**").permitAll() ); } }
额外排查点
- 检查依赖冲突:确认项目是否同时引入了Servlet和Webflux的Security依赖,若存在混合依赖,需明确指定使用Reactive Security(通过
spring.security.reactive.enabled=true配置)。 - 验证请求路径:确保Postman请求的路径严格匹配
/api/**,避免拼写错误(如多写/少写斜杠、路径前缀不符)。 - 调试过滤器链:通过Spring Boot Actuator的
/actuator/filters端点查看过滤器执行顺序,确认REST的SecurityWebFilterChain是否被优先加载。 - 检查Webflux自动配置:确认
spring-boot-starter-webflux是项目的核心Web依赖,而非spring-boot-starter-web(Servlet)。
内容的提问来源于stack exchange,提问作者Armin Hafner
相关产品推荐
相关产品推荐

