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

为什么Spring Security配置了permitAll()的URL仍然要求输入密码?

你遇到的问题主要由路径匹配规则不完整导致,具体原因和修复方案如下:

原因1:h2-console路径匹配不完整

你当前配置的antMatchers("/h2-console/").permitAll()仅匹配路径完全等于/h2-console/的请求:

  • 若访问地址没有带末尾斜杠(如http://localhost:8080/h2-console),无法匹配规则
  • h2-console的内部子路径(如登录接口、静态资源路径/h2-console/login.do、/h2-console/frame.jsp等)都没有被放行,这些路径会命中anyRequest().authenticated()触发认证

原因2:Swagger依赖资源未放行

你仅放行了/swagger-ui/index.html单个页面,但Swagger UI正常运行需要加载大量关联资源,包括:

  • 页面依赖的静态资源(/swagger-ui/*.css、/swagger-ui/*.js等)
  • 接口文档数据接口(/v3/api-docs/**、/v2/api-docs/**、/swagger-resources/**等)
    这些未被放行的资源请求会触发认证,导致页面弹出密码输入框。

修正后的配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .requestMatchers(req -> req.getRequestURI().contains("admin")).hasAuthority(Role.ADMIN.getAuthority())
            // 放行h2-console所有子路径
            .antMatchers("/h2-console/**").permitAll()
            // 放行Swagger所有相关路径
            .antMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .headers().frameOptions().disable()
            .and()
            .httpBasic();
}

如果你用的是Swagger2而非OpenAPI3,把/v3/api-docs/**替换为/v2/api-docs/**即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:30:00