springboot 排除swagger 拦截

本文介绍了一种使用saToken进行路由拦截的配置方法,通过Spring Boot实现,包括配置跨域访问、请求参数验证等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.dc.smart.core.config;

import cn.dev33.satoken.interceptor.SaRouteInterceptor;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.ArrayList;
import java.util.List;

/**
 * saToken 路由拦截器
 * @author coco
 * @date 2021/9/6
 */
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    // 注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> urls = new ArrayList<>();
        urls.add("/favicon.ico");
        urls.add("/error");
        urls.add("/swagger-resources/**");
        urls.add("/webjars/**");
        urls.add("/v2/**");
        urls.add("/doc.html");
        urls.add("**/swagger-ui.html");
        urls.add("/swagger-ui.html/**");
    


        // 注册Sa-Token的路由拦截器,并排除登录接口或其他可匿名访问的接口地址 (与注解拦截器无关)
        registry.addInterceptor(new SaRouteInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns(urls);
    }


    // 资源映射增加
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }


    // <-cors
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowCredentials(true)
                .allowedOriginPatterns("*")
                .allowedHeaders("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .maxAge(3600);
    }
    // cors->



    // <-Validator
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                // 快速失败(Fail Fast)模式,设置为true即可,如果想验证全部,则设置为false或者取消配置即可
                .failFast(true)
                .buildValidatorFactory();

        return validatorFactory.getValidator();
    }

    /**
     * requestParam方式的校验
     * @return
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
        postProcessor.setValidator(validator());
        return postProcessor;
    }


    /**
     * 让spring的请求校验Validator使用我们上边的validator,让设置的failFast生效
     * @return
     */
    @Override
    public org.springframework.validation.Validator getValidator() {
        return new SpringValidatorAdapter(validator());
    }

    // Validator->
}

### 解决方案 在Spring Boot 3中集成Swagger并遇到`401 Unauthorized`问题时,通常是因为安全配置阻止了对Swagger UI资源的访问。以下是可能的原因以及解决方案: #### 原因分析 1. **Spring Security默认拦截所有请求** 如果项目启用了Spring Security,默认情况下会保护所有的HTTP端点,包括Swagger UI页面及其相关资源文件。这可能导致尝试访问Swagger UI时收到`401 Unauthorized`响应。 2. **CORS限制** Swagger UI可能会受到跨域资源共享(CORS)策略的影响,尤其是在前后端分离的应用场景下[^2]。 3. **路径匹配错误** 配置的安全规则可能未正确排除Swagger相关的URL模式,从而导致无法正常加载UI界面。 --- #### 解决方法 ##### 方法一:调整Spring Security配置 确保Spring Security允许匿名访问Swagger的相关路径。可以在Security配置类中添加如下代码片段来放行特定路径: ```java @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorize -> authorize .requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll() // 放行Swagger路径 .anyRequest().authenticated()); http.csrf(AbstractHttpConfigurer::disable); // 禁用CSRF防护以便于测试 return http.build(); } ``` 上述代码通过`.requestMatchers()`指定了哪些路径可以被公开访问而无需身份验证。 ##### 方法二:升级至最新版Swagger/OpenAPI库 由于提到可能存在多态效果异常等问题[^3],建议使用最新的`springdoc-openapi-starter-webmvc-ui`替代传统的` springfox-swagger2 `和` springfox-swagger-ui`组合。此新工具链更适配Spring Boot 3,并提供更好的性能表现与稳定性。 Maven依赖示例: ```xml <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.0.4</version> <!-- 版本号需根据实际需求确认 --> </dependency> ``` 完成替换后重启应用程序再试一次是否仍然存在权限足的情况。 ##### 方法三:检查认证机制实现细节 如果业务逻辑里自定义了一些过滤器或者全局拦截器,则需要进一步排查它们是否会干扰到静态资源加载过程。必要时可临时关闭部分功能用于调试定位根本原因所在。 --- ### 注意事项 - 当前使用的DolphinScheduler版本信息对于解答当前问题影响较小,但如果涉及定时任务管理模块调用外部服务展示文档则另当别论[^4]。 - 推荐始终遵循最小特权原则,在生产环境中仅开放必要的接口供前端消费而是完全解除安全性控制措施。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值