news 2026/2/11 2:00:40

Sa-Token 如何忽略鉴权?三种方式让你灵活放行接口!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Sa-Token 如何忽略鉴权?三种方式让你灵活放行接口!

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

在使用Sa-Token做权限控制时,我们通常希望:

  • /login/register/health等接口无需登录即可访问
  • Swagger 文档、静态资源、验证码接口跳过鉴权
  • 某些临时调试接口暂时关闭权限校验

但如果你配置了全局拦截器,所有请求都会被拦截,返回401 Unauthorized

怎么办?

本文将教你三种官方推荐方式,安全、灵活地忽略 Sa-Token 鉴权,并附上完整 Spring Boot 示例 + 反例避坑指南


🧩 一、前提:你已配置全局拦截器

假设你已经注册了 Sa-Token 的全局路由拦截器(这是最佳实践):

@Configuration public class SaTokenConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaRouteInterceptor()) .addPathPatterns("/**"); // 拦截所有请求 } }

此时,所有接口都需要登录才能访问。我们需要“放行”部分路径。


✅ 方法一:excludePathPatterns(推荐!最常用)

在注册拦截器时,直接排除不需要鉴权的路径

@Configuration public class SaTokenConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaRouteInterceptor()) .addPathPatterns("/**") .excludePathPatterns( "/login", "/register", "/captcha", "/health", "/doc.html", "/webjars/**", "/swagger-resources/**", "/v3/api-docs/**" ); } }

优点:配置清晰、性能高、无侵入
🔥适用场景:公开接口、文档、健康检查等


✅ 方法二:@SaIgnore 注解(方法级忽略)

如果你只想忽略某个 Controller 方法,可以用@SaIgnore注解。

1. 确保你的 Sa-Token 版本 ≥ 1.25.0

2. 在方法上加注解

@RestController public class PublicController { @SaIgnore // ← 忽略 Sa-Token 鉴权 @GetMapping("/public/hello") public String hello() { return "无需登录也能访问!"; } @SaIgnore @PostMapping("/register") public String register(@RequestBody User user) { // 注册逻辑 return "注册成功"; } }

优点:精准控制,适合临时放行
⚠️注意:该注解只对 SaRouteInterceptor 生效,对自定义拦截器无效!


✅ 方法三:在拦截器中手动放行(高级用法)

如果你有复杂的放行逻辑(比如根据 IP、Header 动态判断),可以在自定义拦截器中处理。

public class CustomSaInterceptor extends SaRouteInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String uri = request.getRequestURI(); // 自定义放行规则 if (uri.startsWith("/api/open/") || isWhiteIp(request)) { return true; // 直接放行,不执行父类鉴权 } // 否则走正常 Sa-Token 鉴权 return super.preHandle(request, response, handler); } private boolean isWhiteIp(HttpServletRequest request) { String ip = request.getRemoteAddr(); return "127.0.0.1".equals(ip) || "192.168.1.100".equals(ip); } }

然后注册这个自定义拦截器:

@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new CustomSaInterceptor()) .addPathPatterns("/**"); } }

适用场景:IP 白名单、内部系统调用、灰度发布等


⚠️ 四、反例:错误的忽略方式(千万别用!)

❌ 反例1:在 Controller 里 try-catch 绕过

@GetMapping("/test") public String test() { try { StpUtil.checkLogin(); // 手动校验 } catch (Exception e) { // 忽略异常 → 表面上能访问,但逻辑混乱! } return "xxx"; }

问题

  • 代码冗余;
  • 无法统一管理;
  • 容易漏掉权限校验。

❌ 反例2:全局不注册拦截器,靠每个方法手动 check

@GetMapping("/user") public String user() { StpUtil.checkLogin(); // 每个方法都写 return "..."; }

后果

  • 极易遗漏;
  • 后期维护成本高;
  • 违背“约定优于配置”原则。

✅ 正确做法:用 excludePathPatterns 或 @SaIgnore


🔒 五、安全注意事项

  1. 不要过度放行
    例如:excludePathPatterns("/**")→ 等于没鉴权!

  2. 敏感接口即使公开也要做参数校验
    比如/register虽然免登录,但要防刷、防注入。

  3. Swagger 路径要放全
    常见遗漏:

    - /v3/api-docs - /swagger-ui/** - /doc.html - /webjars/springfox-swagger-ui/**
  4. 生产环境关闭调试接口
    可通过 profile 控制:

    @Profile("dev") @SaIgnore @GetMapping("/debug/clear-cache") public String clear() { ... }

🧪 六、完整示例项目结构

src/main/java └── com.example.satoken ├── config/SaTokenConfig.java ← 拦截器配置 ├── controller │ ├── AuthController.java ← /login(放行) │ ├── UserController.java ← /user/info(需登录) │ └── PublicController.java ← /public/hello(@SaIgnore) └── SatokenApplication.java

测试流程:

  1. 访问/login→ 成功(放行)
  2. 访问/user/info→ 返回 401(未登录)
  3. 登录后携带 token 访问/user/info→ 成功
  4. 访问/public/hello→ 无需 token 也能访问

🎯 总结:如何选择忽略方式?

场景推荐方式
公开接口(登录、注册、健康检查)excludePathPatterns
个别方法临时放行@SaIgnore
动态规则(IP、Header 判断)自定义拦截器
整个模块免鉴权excludePathPatterns("/open/**")

记住:鉴权要严,放行要明!合理使用忽略机制,既能保证安全,又不失灵活性。


视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 11:41:43

【Android毕设全套源码+文档】基于android的高校教室预约管理平台设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/2/9 6:42:23

施耐德伺服驱动器LXM05BD17M2

LXM05BD17M2是施耐德LXM05系列里一款性能很扎实的交流伺服驱动器,特别适合中高速度和高精度定位的应用场景。‌性能特点‌‌核心性能‌:采用无传感器矢量控制技术,动态响应快,稳速精度高,抗负载扰动能力强。‌功率与电…

作者头像 李华
网站建设 2026/2/9 0:40:31

SIEMENS 6ES7452-1AH00-0AE0 控制单元

西门子6ES7 452-1AH00-0AE0控制单元,其实就是个专用于高精度运动控制的电子凸轮控制器,属于S7-400系列的功能模块。它的核心作用是替代机械凸轮,实现电子凸轮控制、电子齿轮、位置同步和高速计数,通过软件编程精确控制主从轴之间的…

作者头像 李华
网站建设 2026/2/9 2:47:47

企业微信外部群运营升级:API 主动推送消息开发实战

QiWe开放平台 个人名片 API驱动企微自动化,让开发更高效 核心能力:为开发者提供标准化接口、快速集成工具,助力产品高效拓展功能场景 官方站点:https://www.qiweapi.com 团队定位:专注企微API生态的技术服务团队 对接…

作者头像 李华
网站建设 2026/2/10 21:01:57

Java接入AI大模型:框架助力与实践指南

Java接入AI大模型是企业实现数智化升级的关键路径,但原生开发面临多模型适配、工程化部署等挑战。JBoltAI作为Java生态下的开发框架,为开发者提供了标准化的集成方案,降低了技术门槛,其设计思路与实践方法具有实际参考意义。一、J…

作者头像 李华
网站建设 2026/2/5 23:16:46

iPhone 与Android :有什么区别?

iPhone 和Android之间关于哪款设备更胜一筹的争论从未停止。最近,随着iOS 26 和Android 16 的发布,关于Android和 iPhone 的讨论也愈演愈烈。虽然可能永远无法分出胜负,但我们仍然希望通过比较来帮助您找到最符合您需求的那款。虽然iOS和Andr…

作者头像 李华