当前位置: 首页 > news >正文

Sa-Token拦截全部接口必须登录-然后自定义注解来匿名登录-作为权限框架支持,并且同时使用了注解和路由的拦截器模式,此部分的配置如下:

场景
在博主目前正在开发的项目中,就采用了Sa-Token作为权限框架支持,并且同时使用了注解和路由的拦截器模式,此部分的配置如下:

@Override  
public void addInterceptors(InterceptorRegistry registry) {  List<String> notMatches = CollectionUtil.newArrayList();  registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");  registry.addInterceptor(new SaRouteInterceptor((req, res, handler) -> {  SaRouter.match("/**").notMatch(notMatches).check(r -> StpUtil.checkLogin());  })).addPathPatterns("/**");  
}

在上述的配置中代表除开notMatches中其他所有的路径都会进行StpUtil.checkLogin()方法来验证是否登录,如果没有登录则会未登录的异常。

但是有的时候又一个个去配置路径太麻烦了,特别是许多接口模块的情况下,于是采用允许匿名访问的注解模式就为一个不错的方法。

引入
首先我们需要新建一个注解,允许它在类及方法上使用:

/**  * 匿名接口,提供SaToken中缺失的匿名注解访问  *  * @author Licoy * */
@Retention(RetentionPolicy.RUNTIME)  
@Target({ElementType.TYPE, ElementType.METHOD,})  
public @interface AnonymousApi {  
}

后面我们再到Sa-Token的拦截器配置中判断执行的方法是否含有此注解,如果有则使用SaRouter.stop()停止匹配,跳出函数。

现在我们修改一下上一小节中的代码:

@Override  
public void addInterceptors(InterceptorRegistry registry) {  List<String> notMatches = CollectionUtil.newArrayList();  registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");  registry.addInterceptor(new SaRouteInterceptor((req, res, handler) -> {  if (handler instanceof HandlerMethod) {  Method method = ((HandlerMethod) handler).getMethod();  if (method.getAnnotation(AnonymousApi.class) != null || method.getDeclaringClass().getAnnotation(AnonymousApi.class) != null) {  SaRouter.stop();  }  }  SaRouter.match("/**").notMatch(notMatches).check(r -> StpUtil.checkLogin());  })).addPathPatterns("/**");  
}

至此,我们就可以愉快的使用@AnonymousApi来允许接口的匿名访问了。
后记
在权限框架中,我们会有很多的特殊路径权限,不得不说Sa-Token为我们提供了一种方便快捷的方式,我看了文档几分钟就完全配置出来了,要是按照以前使用Shiro或者Spring Security,至少都要以天为单位(又或者是因为现在的经验甚比以前了)

相关文章:

  • 虚拟机复制后,无法ping通问题解决
  • Flutter——最详细(AppBar)使用教程
  • 【Linux精讲系列】——vim详解
  • 【Linux】:git基本操作_添加文件_两种场景_查看.git文件 || git修改文件 || 版本回退
  • arima模型python代码
  • 网际报文协议ICMP及ICMP重定向实例详解
  • 数据结构—字符串
  • APISpace IP归属地查询接口案例代码
  • 【网络协议】聊聊HTTPDNS如何工作的
  • Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集
  • 开放智慧,助力学习——电大搜题,打开学无止境的新篇章
  • 使用IDEA让文本对比不在变的困难
  • R语言生物群落(生态)数据统计分析与绘图
  • 论文阅读——InternImage(cvpr2023)
  • docker中odoo项目路径
  • flask接收请求并推入栈
  • HTML5新特性总结
  • java2019面试题北京
  • PAT A1050
  • PHP 的 SAPI 是个什么东西
  • python 学习笔记 - Queue Pipes,进程间通讯
  • 阿里云前端周刊 - 第 26 期
  • 今年的LC3大会没了?
  • 老板让我十分钟上手nx-admin
  • 免费小说阅读小程序
  • 如何合理的规划jvm性能调优
  • 如何解决微信端直接跳WAP端
  • 如何在GitHub上创建个人博客
  • 在Mac OS X上安装 Ruby运行环境
  • Nginx实现动静分离
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​用户画像从0到100的构建思路
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (C#)一个最简单的链表类
  • (Oracle)SQL优化技巧(一):分页查询
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (南京观海微电子)——I3C协议介绍
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)德国人的记事本
  • .aanva
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core使用ef 6
  • .net framework profiles /.net framework 配置
  • .NET 分布式技术比较
  • .net 使用ajax控件后如何调用前端脚本
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @font-face 用字体画图标
  • @GlobalLock注解作用与原理解析
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧