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

文章目录

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

路由拦截鉴权

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

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SaInterceptor(handle-> StpUtil.checkLogin())).addPathPatterns("/**").excludePathPatterns("/login");}
}

测试结果:

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

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

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

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

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {@Overridepublic 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*/ @Overridepublic 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*/ @Overridepublic 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,结果如下表示该用户无此角色被拒:

我们用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,结果如下表示该用户无此权限被拒:

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

进阶用法

那每一个权限标识或者角色我们都要手动配置到配置类中吗,有没有更加简便的方法在我们写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之注解鉴权:优雅的将鉴权与业务代码分离!

sa-token进阶相关推荐

  1. 云原生时代下,容器安全的“四个挑战”和“两个关键”

    作者 | 匡大虎 来源 | 阿里巴巴云原生公众号 云原生进程中的容器安全挑战 云原生的火热带来了企业基础设施和应用架构等技术层面的革新,在云原生的大势所趋下,越来越多的企业选择拥抱云原生,在 CNCF ...

  2. 操作系统——MiniDos

    1 #include <stdio.h> 2 #include <string.h> 3 #include <windows.h> 4 char prog[80], ...

  3. Kube Controller Manager 源码分析

    Kube Controller Manager 源码分析 Controller Manager 在k8s 集群中扮演着中心管理的角色,它负责Deployment, StatefulSet, Repli ...

  4. GitHub 上很火的 7 个项目--架构思想精华

    本文盘点了最近比较火的几个开源项目,涉及 Java.Python.C++ 等,这些开源项目分别是: 1. Java权限认证框架 2. 凤凰架构[非常推荐值得学习] 3. XMind 版 CS 基础知识 ...

  5. CNI 网络分析 4.1 Calico 介绍与原理(一)

    文章目录 Calico 介绍与原理(一) 介绍 安装 Calico-node 初始化 Calico-node 服务 Felix confd allocate-tunnel-addrs monitor- ...

  6. rancher rke 集群恢复

    如果 rancher 是 HA 架构部署,在 HA 架构下,rancher 的数据是保存在 rke local K8S 集群中.所以在 rancher HA 架构下只需要通过 RKE 恢复 local ...

  7. Sa-Token简单登录认证

    sa token是一个全新的权限框架,相比spring security和apache shiro来说,使用起来更加便捷,配置更少,侵入性更小. 下面是一个简单的登录认证示例,以一个spring bo ...

  8. 【架构师成长之路】3-零基础搭建单体项目-集成sa-token

    3.集成sa-token Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.Session会话.单点登录.OAuth2.0.微服务网关鉴权 等一系列权限相关问题. ...

  9. MySQL基础一详解

    数据库的特点 1.将数据放到表中,表再放到库中 2.一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己.表名具有唯一性. 3.表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 ...

  10. openshift 常用命令

    oc get nodes //获取集群所有节点 oc describe node node-name //查看对应节点详细信息,可以看到运行在该节点下的pod oc get pods -n names ...

最新文章

  1. python 同花顺thstrader_GitHub - fswzb/THSTrader: 量化交易。同花顺免费模拟炒股软件客户端的python API。(Python3)...
  2. Linux的系统启动流程
  3. Maven 常见问题
  4. [云炬小程序实战笔记] 第3章 云炬博客小程序全局配置
  5. LINGO 12安装教程
  6. boost::fibers::buffered_channel< std::string >用法的测试程序
  7. Fiori应用的书签模式 - bookmark
  8. MySQL线上优化_线上MySQL千万级大表,如何优化?
  9. php字段验证规则,详解ThinkPHP中自动验证及验证规则
  10. window下spark的安装和开发环境配置
  11. Java SE 9:使用Eclipse和IntelliJ IDEA IDE开发和测试HelloWorld模块(第4部分)
  12. mPush实战笔记4安装mpush
  13. MAVEN setting.xml配置文件详解
  14. RED GIANT-2023版本更新内容介绍
  15. python三阶魔方_三阶魔方自动求解及动态可视化matlab代码
  16. expected an indented block报错的原因
  17. 推荐一款全能的跨平台文档格式转换工具 Pandoc
  18. 量化交易之vn.py篇 - 同步持仓发单逻辑(非净头寸 净头寸)
  19. 移动web——学习笔记整理
  20. MySQL三表查询(学生表、课程表、成绩表)查询出语文成绩比数学成绩高的学生信息

热门文章

  1. 实现SLIC算法生成像素画
  2. 数据库与身份认证 - 04
  3. Matlab + Gurobi入门
  4. heif heic 的区别_什么是HEIF(或HEIC)图像格式?
  5. c++读取文件夹下的多个txt.文件并计算每个txt数据的平均值
  6. java web热区链接_HTML图片热区map area的用法
  7. 让最新免费版WPS支持Office VBA
  8. -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable a
  9. 八皇后-n皇后-2n皇后
  10. idea jdk版本设置