Spring Boot 2.7.3配置CSP后Swagger UI无法访问求助
问题解决:Spring Boot 2.7.3中Swagger因CSP配置无法访问
问题原因
你添加的contentSecurityPolicy("script-src 'self'")限制仅允许加载同源脚本,但Swagger UI本身包含内联脚本,这违反了CSP规则,导致浏览器拒绝执行这些脚本,进而无法正常加载Swagger页面。你尝试的替换为'none'、添加Swagger安全注解的方式,前者完全禁止脚本加载(显然不可行),后者是配置Swagger的JWT认证显示逻辑,和CSP限制无关,所以无效。
解决方案
1. 调整CSP规则,兼容Swagger UI需求
修改contentSecurityPolicy的配置,允许Swagger所需的脚本、样式、图片等资源加载,有两种可选方式:
方式一:允许内联脚本(简单直接,适合内部环境)
将CSP规则修改为:http.headers().contentSecurityPolicy("script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'");说明:
'unsafe-inline'允许浏览器执行内联脚本和样式,适配Swagger UI的内联代码img-src 'self' data:允许加载同源图片和base64格式的图片(Swagger UI会用到这类资源)font-src 'self'确保字体资源正常加载
方式二:使用报错中的哈希值(更安全)
控制台报错里给出了内联脚本的哈希值sha256-qzIUUVyNis8jVHXKlYc4HGAEsn0o42pLmW1do84Uptw=,可以直接加入CSP规则:http.headers().contentSecurityPolicy("script-src 'self' 'sha256-qzIUUVyNis8jVHXKlYc4HGAEsn0o42pLmW1do84Uptw='; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'");注意:如果Swagger UI版本更新,内联脚本内容变化,哈希值会失效,需要重新获取新的哈希值。
2. 确认Swagger路径已加入白名单
确保在安全配置中,Swagger的静态资源路径被允许匿名访问,避免因权限问题无法加载:
// 定义Swagger相关路径 private static final String[] SWAGGER_PATHS = { "/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**", "/swagger-resources" }; @Override public void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .exceptionHandling() .and() .authenticationProvider(provider) .addFilterBefore(authenticationFilter(), AnonymousAuthenticationFilter.class) .authorizeRequests() .requestMatchers(SWAGGER_PATHS).permitAll() // 允许Swagger路径匿名访问 .requestMatchers(PROTECTED_URLS) .authenticated() .and() .csrf().disable().cors() .and() .formLogin().disable() .httpBasic().disable() .logout().disable(); http.headers().frameOptions().sameOrigin(); // 替换为调整后的CSP规则 http.headers().contentSecurityPolicy("script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'"); }
补充说明
你添加的@SecurityScheme和@SecurityRequirement注解是用来在Swagger UI界面中显示JWT令牌输入框的,和当前CSP导致的页面无法加载问题无关,等CSP问题解决后,配置正确的话就能正常在Swagger UI中输入JWT令牌进行接口调试。
内容的提问来源于stack exchange,提问作者Sharvari Nagesh
相关产品推荐
相关产品推荐

