Spring Security Vaadin24配置类permitAll不生效,仅视图级@PermitAll有效
解决Vaadin+Spring Security全局放行后视图无法加载的问题
问题根源
当继承VaadinWebSecurity时,父类的configure(http)方法会注入Vaadin框架专属的安全规则,包括路由请求的权限校验逻辑。原代码中先自定义permitAll规则再调用父类配置,会导致父类规则覆盖自定义的全局放行设置,进而使Vaadin视图路由无法被正确识别和放行。
修复方案
调整配置顺序,先执行父类的安全初始化,再添加全局放行规则,确保所有请求(包括Vaadin路由请求)都能被正确允许访问。
修改后的完整配置类
package com.fractal.security; import com.fractal.views.LoginView; import com.vaadin.flow.spring.security.VaadinWebSecurity; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.provisioning.UserDetailsManager; @EnableWebSecurity @Configuration public class SecurityConfig extends VaadinWebSecurity { @Override protected void configure(HttpSecurity http) throws Exception { // 先执行父类配置,初始化Vaadin安全机制 super.configure(http); // 配置全局所有请求允许访问 http.authorizeHttpRequests() .anyRequest().permitAll(); // 全局放行场景下,登录视图设置可注释(否则仍会跳转登录页但无需验证) // setLoginView(http, LoginView.class); } @Override protected void configure(WebSecurity web) throws Exception { web.ignoring().requestMatchers( "/VAADIN/**", "/favicon.ico", "/robots.txt", "/manifest.webmanifest", "/sw.js", "/offline.html", "/icons/**", "/images/**", "/styles/**", "/h2-console/**"); super.configure(web); } @Bean UserDetailsManager userDetailsManager(){ return new InMemoryUserDetailsManager( User.withUsername("test") .password("{noop}test") .roles("USER") .build() ); } }
补充说明
- 权限精细化控制:如果后续需要对部分视图做权限限制,可替换
anyRequest().permitAll()为针对性配置,示例:http.authorizeHttpRequests() .requestMatchers("/about").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated(); - 密码编码器注意:代码中
{noop}为明文密码标记,仅用于测试环境,生产环境需使用BCrypt等安全密码编码器。
内容的提问来源于stack exchange,提问作者Shavqat Ibrohimov
相关产品推荐
相关产品推荐

