在生产环境中关闭 Swagger-UI

1、概览

在开发环境下使用 Swagger UI 可以很方便地查看、测试 REST 服务。但是出于安全考虑,在生产环境中往往需要禁用 Swagger UI。

2、Swagger 配置

使用 SpringDoc 设置 Swagger,需要在配置 Bean 中对其进行定义。

创建 SwaggerConfig 类:

@Configuration
public class SwaggerConfig {
    
    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI().info(new Info().title("SpringDoc Disable SwaggerUI example")
            .description("SpringDoc Disable SwaggerUI application")
            .version("v0.0.1"));
    }
}

默认情况下,该配置 Bean 会添加到 Spring Context 中。这样,Swagger 可以在所有环境中使用。

3、使用 Spring Profile

在 Spring 中,可以使用 @Profile 注解来启用或禁用 Bean。

使用 SpEL 表达式来指定在哪些环境中激活 Swagger。

@Profile({"!prod && swagger"})

如上,在 swagger Profile,且不是 prod Profile 的情况下才会启注解的 Bean。

在配置类上添加此注解:

@Configuration 
@Profile({"!prod && swagger"})
public class SwaggerConfig {
    ...
}

现在,通过对 spring.profiles.active 属性的不同设置来启动应用,测试它是否有效:

-Dspring.profiles.active=prod // Swagger 被禁用

-Dspring.profiles.active=prod,anyOther // Swagger 被禁用

-Dspring.profiles.active=swagger // Swagger 已启用

-Dspring.profiles.active=swagger,anyOtherNotProd // Swagger 已启用

none // Swagger 被禁用

4、使用条件注解

Spring Profile 可能是一种过于粗粒度的功能切换解决方案。这种方法可能会导致配置错误和冗长、难以管理的 Profile 文件列表。

可以使用 @ConditionalOnExpression 注解作为替代方法,它允许通过自定义属性来启用 Bean:

@Configuration
@ConditionalOnExpression(value = "${useSwagger:false}")
public class SwaggerConfig {
    ...
}

如果 useSwagger 属性不存在,则默认值为 false

可以在 application.properties(或 application.yaml)文件中设置该属性,或者在启动应用时将其设置为 VM 选项:

-DuseSwagger=true

需要注意,在生产环境中千万不要把 useSwagger 误设置为了 true

5、总结

本文介绍了在 Spring Boot 应用中如何通过 @Profile@ConditionalOnExpression 注解来在生产环境中禁用 Swagger。


Ref:https://www.baeldung.com/swagger-ui-turn-off-in-production