为了确保 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 {

    @Override
    protected 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 {

    @Bean
    public 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.propertiesapplication.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 Basic
        AuthName "Restricted Access"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
        ProxyPass 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 {

    @Bean
    public 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 的访问,确保只有授权用户或特定环境下才能访问。选择最适合你的项目需求的方法来实现安全保护。