为什么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
相关产品推荐
相关产品推荐

