Vaadin22集成Spring MVC与Spring Security无默认登录页问题求助
问题核心原因是非Spring Boot场景下没有自动完成Vaadin与Spring Security的适配配置,存在两处关键缺失:一是Spring Security过滤器链未正确放行Vaadin运行必需的静态资源、内部交互路径,导致请求被提前拦截;二是未配置表单登录规则与Vaadin视图访问检查逻辑,登录页跳转规则不生效。
按以下步骤配置即可修复:
1. 补全Spring Security路径拦截规则
重写WebSecurityConfigurerAdapter的configure(HttpSecurity http)方法,添加Vaadin相关路径的放行规则,同时开启默认表单登录:
@Override protected void configure(HttpSecurity http) throws Exception { http // 关闭CSRF校验,适配Vaadin内部UIDL、Push请求机制 .csrf().disable() .authorizeRequests() // 放行Vaadin静态资源与内部端点 .antMatchers( "/VAADIN/**", "/frontend/**", "/icons/**", "/images/**", "/sw.js", "/manifest.webmanifest", "/offline.html", "/UIDL/**", "/HEARTBEAT/**", "/push/**", "/connect/**", "/login", "/error" ).permitAll() // 其余所有请求需认证后访问 .anyRequest().authenticated() .and() // 启用Spring Security默认表单登录页 .formLogin() .and() // 配置登出后跳转首页 .logout() .logoutSuccessUrl("/"); }
2. 调整过滤器优先级
非Spring Boot环境不会自动调整Servlet过滤器顺序,需将Spring Security过滤器链优先级设置为高于Vaadin Servlet,避免Vaadin提前拦截请求。在安全配置类上添加如下注解即可:
@Configuration @EnableWebSecurity @Order(Ordered.HIGHEST_PRECEDENCE + 10) public class SecurityConfig extends WebSecurityConfigurerAdapter { // 配置内容见第一步 }
如果使用web.xml配置过滤器,确保springSecurityFilterChain的映射配置在Vaadin Servlet之前。
3. 手动注册Vaadin视图访问检查器
非Spring Boot环境不会自动装配视图级权限检查的Bean,需在配置类中手动注册,同时指定登录页路径:
@Bean public ViewAccessChecker viewAccessChecker() { ViewAccessChecker accessChecker = new ViewAccessChecker(); accessChecker.setLoginView("/login"); return accessChecker; }
4. 启动验证
配置完成后执行启动命令:
mvn jetty:run
启动后访问应用任意路径,未认证状态下会自动跳转至Spring Security默认登录页。默认用户名为user,启动日志中会打印随机生成的临时密码,可通过配置内存用户、JDBC用户源等方式自定义账号密码。
注:VaadinWebSecurityConfigurerAdapter是Spring Boot专属适配类,依赖Boot的自动配置API,非Boot环境不需要使用,手动配置上述规则即可实现完全一致的视图级访问控制能力。
内容的提问来源于stack exchange,提问作者smillied

