Spring Security+Vaadin配置/notifications端点解决401报错
问题原因
- 启动报错的核心原因:
VaadinWebSecurityConfigurerAdapter的父类configure()方法内部已经默认配置了anyRequest().authenticated()全局认证规则,Spring Security要求路径匹配规则必须按「精确路径在前、宽泛通配在后」的顺序配置,anyRequest()必须是最后一条规则。你之前把自定义的antMatchers规则写在super.configure(http)调用之后,相当于在全局规则之后追加精确路径规则,直接触发配置校验异常。 - 接口401的额外原因:你在Controller方法上加的
@AnonymousAllowed是Vaadin专属的视图访问注解,仅对Vaadin Flow路由页面生效,对@RestController定义的标准Spring MVC接口没有放行效果,不能靠这个注解绕过安全校验。
正确配置方案
调整WebSecurityConfig的配置顺序,必须在调用父类configure方法之前定义你要放行的端点规则,代码如下:
@EnableWebSecurity @Configuration public class WebSecurityConfig extends VaadinWebSecurityConfigurerAdapter { private static final String LOGIN_URL = "/login"; @Override protected void configure(HttpSecurity http) throws Exception { // 1. 先配置自定义的公开端点规则,必须放在super.configure调用之前 http.authorizeRequests() .antMatchers("/notifications") .permitAll(); // 可选:如果webhook请求触发403 CSRF错误,放开下面这行注释给端点关闭CSRF校验 // http.csrf().ignoringAntMatchers("/notifications"); // 2. 再调用父类配置,加载Vaadin默认的安全规则 super.configure(http); // 3. 最后配置OAuth2登录逻辑 http.oauth2Login() .loginPage(LOGIN_URL) .permitAll(); } }
配置说明
- 规则顺序不能调换:父类方法加载的Vaadin默认规则最后会追加
anyRequest().authenticated(),所有自定义的精确路径放行规则必须在这之前定义,否则就会触发你遇到的启动错误。 - 配置完成后重启应用,第三方服务发送到
/notifications的POST请求不需要携带认证凭证,不会再返回401未授权错误。 - 如果你后续升级到Spring Security 6.x版本,把代码里的
antMatchers替换为requestMatchers、ignoringAntMatchers替换为ignoringRequestMatchers即可适配。
内容的提问来源于stack exchange,提问作者Александр Хворостенко
相关产品推荐
相关产品推荐

