SpringBoot+Vaadin配置特定URL免登录仍跳转登录页如何解决
问题根源排查
1. Vaadin全局路由拦截器规则疏漏
你当前写的ConfigureUIServiceInitListener的校验逻辑只排除了LoginView,没有把/FormClient对应的视图类加入白名单,哪怕你Spring Security放行了请求,Vaadin的路由前拦截还是会把未登录用户重定向到登录页。你反馈注释了逻辑还不生效,大概率是修改后没有正确重启项目,或者类上的@Component没有注释,仍然被Spring扫描加载了。
2. Spring Security路径匹配精度问题
如果FormClient路径下还有子请求,或者该页面依赖Vaadin的内部请求路径未放行,也可能触发拦截。
具体修复方案
第一步:修改Vaadin路由拦截逻辑
修改authenticateNavigation方法,把你要放行的Form页面对应的视图类加到白名单里,假设/FormClient对应的视图类是FormClientView,代码调整如下:
private void authenticateNavigation(BeforeEnterEvent event) { // 把FormClient对应的视图类加入白名单 if (!LoginView.class.equals(event.getNavigationTarget()) && !FormClientView.class.equals(event.getNavigationTarget()) && !SecurityUtils.isUserLoggedIn()) { event.rerouteTo(LoginView.class); } }
如果要快速验证是不是拦截器导致的问题,直接把类上的@Component注解注释掉,重启项目再测试即可。
第二步:优化Spring Security配置
如果你的Form页面依赖了Vaadin的静态资源或者内部请求,可以把/FormClient/**也加到放行规则里,也可以直接加到web.ignoring()的规则里实现更高优先级的放行:
@Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .requestCache().requestCache(new CustomRequestCache()) .and() // 放行FormClient所有相关路径 .authorizeRequests().antMatchers("/FormClient", "/FormClient/**").permitAll() .anyRequest().authenticated() // 原有后续逻辑保持不变 .formLogin() .loginPage(LOGIN_URL).permitAll() .loginProcessingUrl(LOGIN_PROCESSING_URL) .failureUrl(LOGIN_FAILURE_URL) .and().logout().logoutSuccessUrl(LOGOUT_SUCCESS_URL); }
如果需要完全绕过Spring Security过滤器链校验,把路径加到WebSecurity忽略列表即可:
@Override public void configure(WebSecurity web) { web.ignoring().antMatchers( "/FormClient", "/FormClient/**", // 原有忽略的路径保持不变 "/VAADIN/**", "/favicon.ico", "/robots.txt", "/sms/", "/manifest.webmanifest", "/sw.js", "/offline.html", "/icons/**", "/images/**", "/styles/**", "/h2-console/**"); }
第三步:验证测试
修改完成后清空浏览器缓存,重启项目,用无痕窗口访问/FormClient路径即可验证效果。
内容的提问来源于stack exchange,提问作者Nacho
相关产品推荐
相关产品推荐

