You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成Spring Security后无法访问H2-Console的解决求助

解决方案:Spring Security 6 + H2控制台403问题修复

针对你的Spring Boot 3.0.6 + Spring Security 6.1.0环境,仅配置/h2-console/**允许匿名访问还不够,需要补充以下关键配置:

1. 分离H2控制台与API的安全规则

由于H2控制台依赖会话(Session)和iframe展示,而你的API采用无状态(STATELESS)会话策略,建议将两者的安全配置分开,避免规则冲突:

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {

    private final JwtAuthenticationFilter jwtAuthFiler;
    private final AuthenticationProvider authenticationProvider;

    // 优先处理H2控制台的请求
    @Bean
    @Order(1)
    public SecurityFilterChain h2ConsoleSecurityFilterChain(HttpSecurity http) throws Exception {
        http
                // 仅匹配H2控制台的路径
                .securityMatcher("/h2-console/**")
                // H2控制台提交请求无需CSRF防护
                .csrf(csrf -> csrf.disable())
                // 允许iframe加载H2控制台(否则页面无法正常渲染)
                .headers(headers -> headers.frameOptions(frame -> frame.sameOrigin()))
                // 允许所有H2控制台的请求匿名访问
                .authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
                // H2控制台需要创建会话,设置为按需创建
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED));
        return http.build();
    }

    // 处理API的安全规则
    @Bean
    @Order(2)
    public SecurityFilterChain apiSecurityFilterChain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .csrf(csrf -> csrf.disable())
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/api/v1/auth/**").permitAll()
                        .anyRequest().authenticated()
                )
                .sessionManagement(session -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                        .sessionConcurrency(sessionConcurrency -> sessionConcurrency
                                .maximumSessions(1)
                                .expiredUrl("/api/v1/auth/login")
                        )
                )
                .authenticationProvider(authenticationProvider)
                .addFilterBefore(jwtAuthFiler, UsernamePasswordAuthenticationFilter.class);

        return httpSecurity.build();
    }
}

2. 验证application.properties中的H2基础配置

确保H2控制台的核心配置正确,避免因控制台未启用导致的访问问题:

# 启用H2控制台
spring.h2.console.enabled=true
# 控制台访问路径,需与安全配置中的路径一致
spring.h2.console.path=/h2-console
# H2内存数据库连接配置
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

关键说明

  • iframe权限:Spring Security默认拦截iframe加载,frameOptions().sameOrigin()允许同域下的iframe正常渲染,这是H2控制台能显示的必要条件;
  • 会话策略分离:全局设置STATELESS会阻止H2控制台创建会话,单独为H2配置IF_REQUIRED可满足其会话需求;
  • 配置优先级:@Order(1)确保H2控制台的请求先被处理,不会被API的安全规则拦截。

内容的提问来源于stack exchange,提问作者Capmu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:37:52