为了确保 Swagger UI 不暴露在外部访问下,可以采取以下几种方法来限制访问:
方法1:通过认证和授权限制访问
为 Swagger UI 页面设置访问控制,确保只有授权用户才能访问。
1.1 Spring Security
如果使用的是 Spring Boot,可以使用 Spring Security 来保护 Swagger UI 页面。
在 SecurityConfig
中配置:
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.configuration.WebSecurityConfigurerAdapter;@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/webjars/**", "/swagger-ui/**").authenticated().anyRequest().permitAll().and().httpBasic(); // 可以选择其他认证方式,如 OAuth2}
}
1.2 使用 API Key 或 Token
配置 Swagger UI 使用 API Key 或 Token 进行访问。
在 Swagger 配置文件中添加 API Key 认证:
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiKey;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.Collections;@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build().securitySchemes(Collections.singletonList(apiKey()));}private ApiKey apiKey() {return new ApiKey("apiKey", "X-API-KEY", "header");}
}
方法2:通过配置文件进行限制
2.1 Spring Boot
在 application.properties
或 application.yml
文件中配置 Swagger 的访问路径。
# application.properties
springdoc.swagger-ui.path=/hidden/swagger-ui.html
或者在 application.yml
中:
# application.yml
springdoc:swagger-ui:path: /hidden/swagger-ui.html
方法3:Nginx 或 Apache 代理服务器
在使用 Nginx 或 Apache 作为反向代理时,限制 Swagger UI 的访问。
3.1 Nginx 配置
在 Nginx 配置文件中添加访问控制:
server {listen 80;server_name yourdomain.com;location /webjars/swagger-ui/ {auth_basic "Restricted Access";auth_basic_user_file /etc/nginx/.htpasswd;proxy_pass http://localhost:8080/webjars/swagger-ui/;}
}
3.2 Apache 配置
在 Apache 配置文件中添加访问控制:
<VirtualHost *:80>ServerName yourdomain.com<Location /webjars/swagger-ui/>AuthType BasicAuthName "Restricted Access"AuthUserFile /etc/apache2/.htpasswdRequire valid-userProxyPass http://localhost:8080/webjars/swagger-ui/ProxyPassReverse http://localhost:8080/webjars/swagger-ui/</Location>
</VirtualHost>
方法4:完全禁用 Swagger UI 在生产环境
在生产环境中完全禁用 Swagger UI 以确保安全。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@EnableSwagger2
@Configuration
public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build().enable(!isProduction()); // 根据环境变量或配置文件判断是否启用 Swagger}private boolean isProduction() {// 实现环境判断逻辑,例如读取环境变量或配置文件return "prod".equals(System.getProperty("spring.profiles.active"));}
}
通过这些方法,你可以有效地限制 Swagger UI 的访问,确保只有授权用户或特定环境下才能访问。选择最适合你的项目需求的方法来实现安全保护。