控制Swagger访问的动态过滤器实现

 

控制 Swagger 访问的动态过滤器实现

在现代 Web 应用开发中,为了安全性和便捷性,经常需要在不同的环境下动态控制 API 文档页面的访问。本文将解读一段 Java 代码,展示如何通过一个自定义的过滤器来控制 Swagger 文档的访问权限。

背景

Swagger 是一个流行的 API 文档生成工具,但在生产环境中,通常我们不希望所有用户都能访问这些文档。通过动态配置信息来控制 Swagger 页面的访问,可以帮助提升应用的安全性。

代码实现

以下代码片段展示了如何使用 Java 过滤器来实现这个功能:



import javax.annotation.Resource;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import com.XXX.biz.util.VteDetectUtil;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/*
 * @Author: meowQAQ
 * @Date: 2/20/2025
 * @Description: 通过过滤器动态控制Swagger文档访问
 */
@Component
@WebFilter("/*")
public class SwaggerAccessFilter implements Filter {

    @Resource
    private VteDetectUtil vteDetectUtil;

    @Resource
    private Environment environment;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 从数据库或其他配置源读取开关配置
        Boolean enable = "1".equals(vteDetectUtil.getConfigurationByKey("enable_swagger"));

        // 获取应用程序的上下文路径
        String contextPath = environment.getProperty("server.servlet.context-path", "");

        // 将请求和响应对象转化为HTTP协议特有的对象
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 获取请求的实际路径
        String path = httpRequest.getRequestURI();

        // 检查请求路径是否为Swagger文档页面
        if (path.startsWith(contextPath + "/doc.html")) {
            // 如果Swagger未启用,返回403 Forbidden
            if (!enable) {
                httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
                return;
            }
        }

        // 如果Swagger启用或不是针对文档的请求,继续处理请求
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化过滤器配置
    }

    @Override
    public void destroy() {
        // 销毁过滤器时的操作
    }
}

代码解读

  1. 资源注入:通过@Resource注解注入VteDetectUtil类用于获取配置信息,Environment用于读取应用的环境变量,特别是上下文路径。

  2. 路径匹配和访问控制:在处理请求时,过滤器会检查请求路径是否为 Swagger 文档页面(/doc.html开头)。如果 Swagger 功能在配置中被禁用,则会返回 HTTP 403 Forbidden 状态,阻止访问。

  3. 上下文路径:通过Environment获取应用的server.servlet.context-path配置,确保路径匹配处理在任何上下文路径下都准确。

  4. 过滤器生命周期:重写init()destroy()以处理过滤器的初始化和销毁,但目前实现中没有额外的操作。


本文遵守 Attribution-NonCommercial 4.0 International 许可协议。 Attribution-NonCommercial 4.0 International