sa-token进阶

news2024/11/24 22:46:25

介绍sa-token实际应用的高阶用法。

文章目录

  • 路由拦截鉴权
  • 绑定角色权限标识
    • 角色校验/权限校验
      • 测试角色标识
      • 测试权限标识
    • 进阶用法

路由拦截鉴权

定义配置类SaTokenConfigure->实现WebMvcConfigurer,设置一个只对login请求放通的拦截器:

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handle-> StpUtil.checkLogin()))
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

测试结果:

我们在未登录的情况下,此时cookie值为空,访问其他接口则返回NotLoginException异常(通常情况下我们可以做个全局异常捕获,如果获取到该异常则用统一格式返回,这里不做详细描述,可以参考:实现全局异常处理):

image-20221219135927945

登录成功之后,cookie值存在,访问其他接口正常:

image-20221219140106216

至此,我们一个简单的登录拦截器就已经实现了。

其实我们可以继续进行优化,使用sa-token封装的SaRouter路由写法使得更容易定义,具体SaRouter的用法可以参考官网-校验函数详解,以下仅为官网示例:

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(Handler -> {
            // 等同于下方的简写写法
            // SaRouter
            //        // 拦截的path列表 支持写多个
            //        .match("/**")
            //        // 排除掉的path 支持写多个
            //        .notMatch("/login")
            //        // 要执行的校验动作
            //        .check(r -> StpUtil.checkLogin());
            // 可以简写登录校验 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
            SaRouter.match("/**", "/login", r -> StpUtil.checkLogin());
            // 角色校验 -- 拦截以 admin 开头的路由,必须具备 admin 角色或者 super-admin 角色才可以通过认证
            SaRouter.match("/admin/**", r -> StpUtil.checkRoleOr("admin", "super-admin"));

            // 根据路由划分模块,不同模块不同鉴权
            SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
        }));
    }
}

绑定角色权限标识

接下来我们介绍如何将自定义的角色和权限标识与sa-token结合在一起。

首先我们需要定义一个StpInterfaceImpl -> 实现StpInterface接口,需要实现两个方法分别是getPermissionList,getRoleList,此处需要注意的是只要配置了角色或者权限标识的拦截,那么每一次请求都会访问这两个方法,可以考虑做个缓存,以避免频繁请求用户信息:

@Component
public class StpInterfaceImpl implements StpInterface {

    /**
     * 返回一个账号所拥有的权限码集合
      * @param loginId  账号id
     * @param loginType 账号类型
     * @return
     */ 
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 此处通常对接用户权限表根据loginId查询对应用户的权限信息。此处仅作模拟loginId="1" 则拥有order权限标识,否则没有
        if ("1".equals(loginId)){
            return Arrays.asList("orders");
        }else {
            return Arrays.asList("default");
        }
    }

    /**
     * 返回一个账号所拥有的角色标识集合
      * @param loginId  账号id
     * @param loginType 账号类型
     * @return
     */ 
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 此处通常对接用户角色表根据loginId查询对应用户的角色标识信息。此处仅作模拟loginId="666" 表示管理员,否则非管理员
        if ("666".equals(loginId)){
            return Arrays.asList("admin");
        }else {
            return Arrays.asList("general");
        }
    }
}

角色校验/权限校验

结合上一章节中的配置信息,我们创建对应的controller进行测试:

// 角色校验 -- 拦截以 admin 开头的路由,必须具备 admin 角色或者 super-admin 角色才可以通过认证
SaRouter.match("/admin/**", r -> StpUtil.checkRoleOr("admin", "super-admin"));

// 根据路由划分模块,不同模块不同鉴权
SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));

测试角色标识

@RestController
@RequestMapping("/admin")
public class AdminController {

    @GetMapping("/test")
    public String test(){
        return "admin角色允许访问";
    }
}

我们用usId=“2”,即表示没有管理员角色进行访问/admin/test,结果如下表示该用户无此角色被拒:

image-20221219154427345

我们用usId=“666”,即表示管理员角色进行访问/admin/test,结果如下表示用户具备该角色请求放通:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUzuMozV-1671439109823)(null)]

测试权限标识

@RestController
@RequestMapping("/orders")
public class AdminController {

    @GetMapping("/test")
    public String test(){
        return "orders权限标识允许访问";
    }
}

我们用usId=“2”,即表示没有管理员角色进行访问/orders/test,结果如下表示该用户无此权限被拒:

image-20221219160703980

我们用usId=“1”,即表示管理员角色进行访问/orders/test,结果如下表示用户具备该权限请求放通:

image-20221219160959487

进阶用法

那每一个权限标识或者角色我们都要手动配置到配置类中吗,有没有更加简便的方法在我们写controller就对应好角色和标识的关系。

这里我们需要了解两个注解:

  • @SaCheckRole:角色认证
  • @SaCheckPermission:权限标识

此时我们只需要在管控的controller对应位置上加上注解就能完成配置类中的功能,加在类名上表示该controller下的所有入口遵从认证标识:

@SaCheckRole("admin")
@RestController
@RequestMapping("/admin")
public class AdminController {

    // 所有的请求都需要满足角色admin...
}

@RestController
@RequestMapping("/admin")
public class AdminController {

    // 只有该请求需要满足角色admin
    @SaCheckRole("admin")
    @GetMapping("/testAnno")
    public String testAnno(){
        return "注解方式实现角色放通";
    }
}

同理,权限标识也是如此:

@SaCheckPermission("orders")
@RestController
@RequestMapping("/orders")
public class OrderController {

    // 所有的请求都需要满足权限标识orders...
}
@RestController
@RequestMapping("/orders")
public class OrderController {
    
    @SaCheckPermission("orders")
    @GetMapping("/test")
    public String test(){
        return "orders权限标识允许访问";
    }
}

若存在需要多个权限或者角色标识来判断的情况,我们可以使用如下写法:

// 同时具备大括号中的所有权限标识才放通
@SaCheckPermission({"user-add", "user-delete", "user-update"})
// 只要具备其中一个权限标识就可以进入
@SaCheckPermission(value = {"user-add", "user-delete", "user-update"}, mode = SaMode.OR)

角色注解同理:

// 同时具备大括号中的所有角色才放通
@SaCheckRole({"admin", "my-role"})
// 只要具备其中一个角色就可以进入
@SaCheckRole(value = {"admin", "my-role"}, mode = SaMode.OR)

还有其他相关注解,例如:

  • @SaCheckLogin:登录认证 —— 只有登录之后才能进入该方法
  • @SaCheckSafe:二级认证校验 —— 必须二级认证之后才能进入该方法
  • @SaCheckBasic:HttpBasic认证 —— 只有通过 Basic 认证后才能进入该方法

参考资料:

  • 注册 Sa-Token 路由拦截器
  • Sa-Token之注解鉴权:优雅的将鉴权与业务代码分离!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商密SIG月度动态:文件加密支持SM4算法、Anolis 8.8将默认集成 | 龙蜥 SIG

商密软件栈 SIG 目标&#xff1a;基于Anolis Linux&#xff0c;在整个系统软件层面&#xff08;包括硬件&#xff0c;固件&#xff0c;bootloader&#xff0c;内核以及 OS&#xff09;实现以商密算法为主的全软件栈商密操作系统&#xff0c;结束一直以来商密软件生态碎片化的状…

B站李沐讲论文笔记Resnet

研一学生笔记&#xff0c;若有看官&#xff0c;笔下留情 作者 Kaiming He Xiangyu Zhang Shaoqing Ren&#xff08;在蔚来居然&#xff09; Jian Sun&#xff08;导师&#xff09; Microsoft Research 摘要&#xff1a; 我们提出一个网络&#xff0c;他可以简化网络的训练&…

【 Apifox】Apifox的前置操作与后置操作

Apifox官网地址&#xff1a;http://apifox.cn/a103abcc 文章目录一、断言二、提取变量三、数据库操作结语一、断言 后置操作支持添加断言&#xff0c;可对接口返回的数据&#xff08;或响应时间&#xff09;设置断言&#xff0c;判断是否符合预期。 设置断言&#xff1a; 运行…

与客户共解难题:BPM如何高标准国产化?

作为深耕中国本土BPM市场近二十年的老牌企业&#xff0c;上海斯歌已服务超过700家大型及超大型企业&#xff0c;在医药、汽车汽配、智能制造、房地产等行业积淀了深厚的服务能力&#xff0c;从始至终斯歌都在思考&#xff1a;如何以最佳的服务能力解决客户需求&#xff0c;成就…

Express 学习 - 02-中间件应用-urlencoded解析

请求模拟 什么是中间件&#xff1f; 中间件的本质是传递给express的一个回调函数&#xff1b;这个回调函数接受三个参数&#xff1a;请求对象&#xff08;request对象&#xff09;&#xff1b;响应对象&#xff08;response对象&#xff09;&#xff1b;next函数&#xff08;在…

用Rust写的Turbopack,比Vite快20倍?

日前&#xff0c;Vercel正式宣布推出新的包装工具Turbopack。Vercel声称这是用Rust编写的Webpack的继任者。在大型应用程序中&#xff0c;它的速度是Vite的10倍&#xff0c;是Webpack的700倍。维特的维护者对此表示怀疑。 Vercel发布新的开源工具Turbopack Vercel是Next。js框…

【数模】层次分析法

对于同一层次中的指标&#xff0c;通过两两比较&#xff0c;构造出判断矩阵&#xff0c;记为A。 aij表示因素i对因素j的重要性比较结果&#xff0c;可采用1-9的量化比例标度来反映其重要程度。 1&#xff1a;指标两个相比&#xff0c;A比B同等重要 3&#xff1a;指标两个相比…

E. Permutation Game(game)

Problem - E - Codeforces 两个玩家正在玩一个游戏。他们有一个整数1&#xff0c;2&#xff0c;...&#xff0c;n的排列组合&#xff08;排列组合是一个数组&#xff0c;其中从1到n的每个元素正好出现一次&#xff09;。这个排列组合没有按升序或降序排序&#xff08;即排列组合…

YOLO系列目标检测算法——YOLOS

YOLO系列目标检测算法目录 - 文章链接 YOLO系列目标检测算法总结对比- 文章链接 YOLOv1- 文章链接 YOLOv2- 文章链接 YOLOv3- 文章链接 YOLOv4- 文章链接 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 PP-YOLO- 文章链接 …

视频:R语言中的Stan概率编程MCMC采样的贝叶斯模型

概率编程使我们能够实现统计模型&#xff0c;而不必担心技术细节。这对于基于MCMC采样的贝叶斯模型特别有用。 最近我们被客户要求撰写关于Stan的研究报告&#xff0c;包括一些图形和统计输出。 R语言中RStan贝叶斯层次模型分析示例stan简介 Stan是用于贝叶斯推理的C 库。它…

十、Docker 复杂安装之3主3从redis集群配置

假设公司现在1-2亿条数据需要缓存,单机单台设备肯定扛不住的,这个时候就需要分布式存储,用redis如果落地呢?本期就带着大家搭建一个3主3从redis集群。 1、拉取redis6.0.8镜像 涉及命令:docker pull redis:6.0.8 实例: 2、创建6个redis容器实例 涉及命令: docker ru…

k8s远程debug

k8s远程debug 1、方案1 方案1是不行的&#xff0c;因为k8s的ingress走的7层协议。 1.1、应用 启动debug端口 java -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -server -Xms1024m -Xms1024m -jar /opt/app/server.jarnetstat -ntlp1.2、配置k8s的网络和域…

Qt-Web混合开发-QWebSocket作为QWebChannel通信数据传输接口(10)

Qt-Web混合开发-QWebSocket作为QWebChannel通信数据传输接口&#x1f499;&#x1f353; 文章目录Qt-Web混合开发-QWebSocket作为QWebChannel通信数据传输接口&#x1f499;&#x1f353;1、概述&#x1f41b;&#x1f986;2、实现效果&#x1f605;&#x1f64f;3、实现功能&a…

m通过matlab实现遥测信道主要影响因素分析

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 遥测技术是指被测对象的状态参数进行超远距离测量&#xff0c;并将测量的数据通过特殊的通信方式发送给地面接收站的一种技术。整个遥测发送接收系统称为遥测系统&#xff0c;而发送遥测信号所通…

LaTeX教程(一)——LaTeX介绍以及导言详解

文章目录1. Latex 介绍2. LaTeX基础2.1 导言区2.2 正文区3. 导言详解3.1 设置时间、作者、日期3.2 全局设置4. 文件组织1. Latex 介绍 什么是LATEX &#xff1f;LATEX 是一种格式。为免误会&#xff0c;初次接触这一概念的读者可以粗略地将 LATEX 理解成是对 TEX 的一层封装。…

【DELM回归预测】基于matlab松鼠算法改进深度学习极限学习机SSA-DELM数据回归预测【含Matlab源码 1904期】

⛄一、PSO-DELM简介 1 DELM的原理 在2004年&#xff0c;极限学习机&#xff08;extreme learning machine,ELM&#xff09;理论被南洋理工大学的黄广斌教授提出&#xff0c;ELM是一种单隐含层前馈神经网络&#xff08;single-hidden layer feedforward neural network,SLFN&am…

开发社交聊天APP需要注意什么?如何快速开发聊天功能

随着互联网的发展&#xff0c;人们的沟通方式也在悄悄发生变化&#xff0c;由原来的面对面沟通&#xff0c;发展为网上沟通。让大家日常生活的通讯越来越方便了&#xff0c;各种APP层出不穷。那么&#xff0c;想开发一款社交聊天并进行运营&#xff0c;需要注意哪些方面&#x…

【推荐】产品经理需求模板,案例等文档合集15篇

产品经理的职责描述仍然分歧很多&#xff0c;因人、因公司而异。即使是在相对较为一致的高科技行业&#xff0c;不同公司中的职位描述也是很不同的。但通常认为产品经理的职责主要包括&#xff1a;产品经理负责调查并根据用户的需求,确定开发何种产品, 选择何种技术、商业模式等…

【Python机器学习】过拟合及其抑制方法讲解及实战(图文解释 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~ 欠拟合、过拟合与泛化能力 欠拟合 最简单的线性模型&#xff0c;它是用一条直线来逼近各个样本点&#xff0c;显然力不从心&#xff0c;这种现象称为欠拟合。欠拟合模型是由于模型复杂度不够&#xff0c;训练样本集容量不够&#…

哈希表题目:环形链表

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析题目 标题和出处 标题&#xff1a;环形链表 出处&#xff1a;141. 环形链表 难度 2 级 题目描述 要求 给你一个链表的头结点 head\texttt{head}h…