7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

news2024/11/26 13:53:21

CSDN成就一亿技术人

文章目录

  • 前言
  • 一、定义注解annotation
  • 二、拦截角色注解
    • 1. 在拦截器哪里拦截?
    • 2. 如何拦截角色注解?
    • 3. 角色如何读取?
    • 4. 最后做角色校验
  • 三、应用:给管理员操作接口加注解
  • 四、PostMan测试
  • 最后


前言

在【7.1】管理员图书录入和修改API,当时预告过:并没有写【校验是否是管理员】的逻辑,因为是通用逻辑,会单写一篇来细讲,那么今天就来安排!

角色权限校验,是保证接口安全必备的能力:有权限才可以操作!所以,一般对于这种通用逻辑,推荐不与主业务逻辑耦合,那么怎么来解耦?

在SpringBoot中过滤器拦截器切面,都可以实现统一角色校验的功能解耦,为了和【3-3 】用户身份认证的拦截器方案保持一致,我们采用SpringBoot拦截器Interceptor实战统一角色权限校验! 使用AOP的话,你会实现吗?文末投票不实名,让我们有更多的互动吧~~


一、定义注解annotation

通用功能定义在tg-book-common中

我们最终实现的效果是:加了@Role注解以后,这个接口只有管理员才能访问,学生访问接口就会报错:无权限!

下面定义一个角色注解,通过@Target 指定作用于方法上。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Role {
    /**
     * 角色id数组,默认1-管理员
     **/
    int[] roleIds() default { 1 };
}

定义roleIds,是保留扩展性。若后面扩展出【校长】等其它角色,我们可以通过int数组来任意组合角色,只要拥有int数组中的任意角色id即可访问该接口。


二、拦截角色注解

1. 在拦截器哪里拦截?

显然,首先需要【用户身份认证】通过,然后再校验角色!即在AuthInterceptorpreHandle的保存至授权上下文之前:AuthContextInfo.setAuthInfo(authInfo);

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    。。。省略一大堆用户身份认证代码。。。

    // TODO 校验角色:写在这!
    

    // 校验成功, 保存至认证上下文
    AuthContextInfo.setAuthInfo(authInfo);
    return true;
}

2. 如何拦截角色注解?

可以通过将handler转成HandlerMethod以后,通过getAnnotation来获取!

HandlerMethod handlerMethod = (HandlerMethod) handler;
Role role = handlerMethod.getMethod().getAnnotation(Role.class);
if (role != null) {
    // 走到这,说明方法上加了@Role
    
}

3. 角色如何读取?

前2步以后,我们就拿到了当前登录的userId,也拿到了接口要求的roleIds数组,所以至少有两种方案:

  1. 可以通过userId去查一次MySQL,然后判断一下角色,这种我就不实现了,你可以自己去查询实现!
  2. 将roleId保存在token中!,本文实现的是另一种方案,是为了扩展一下大家的思路,也就是不走MySQL查询的方案。

AuthContextInfo类中增加字段来承载角色:

private Integer roleId;

在这里插入图片描述

loginByPassword中将role设置到authContextInfo.roleId

authContextInfo.setRoleId(user.getRole());

在这里插入图片描述
接着在JwtTokenProvider中定义payload的自定义字段r:

// payload的自定义字段r
private static final String CLAIM_ROLE = "r";

在JwtTokenProvider.create中将它保存到token的payload中:

// 自定义 role
.withClaim(CLAIM_ROLE, authContextInfo.getRoleId())

在这里插入图片描述

在JwtTokenProvider.verify中将它从token中解析出来:
在这里插入图片描述

4. 最后做角色校验

拿到了authInfo.getRoleId(),还知道了接口方法要求的roleIds,判断逻辑太简单了吧~ 我简单写了一下,如下:

// 校验角色
HandlerMethod handlerMethod = (HandlerMethod) handler;
Role role = handlerMethod.getMethod().getAnnotation(Role.class);
if (role != null) {
    // 走到这,说明方法上加了@Role
    boolean isAdmin = false;
    for (int roleId : role.roleIds()) {
        if (authInfo.getRoleId().equals(roleId)) {
            isAdmin = true;
            break;
        }
    }
    if (!isAdmin) {
        log.info("[403]无权限, token={}", token);
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        // 别忘了返回false
        return false;
    }
}

三、应用:给管理员操作接口加注解

在实现了通用校验逻辑以后,接下来就是如何应用了!
其实就是:加@Role注解

下面对管理员录入和修改图书接口加了注解,其它接口同理~~

在这里插入图片描述


四、PostMan测试

使用role=0的账号调用管理员API,返回403!
在这里插入图片描述

使用管理员账号则会正常执行!就不做截图了!另外,别忘了提交Git!


最后

想要看更多实战好文章,还是给大家推荐我的实战专栏–>《基于SpringBoot+SpringCloud+Vue前后端分离项目实战》,由我和 前端狗哥 合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验!

具体的优势、规划、技术选型都可以在《开篇》试读!

订阅专栏后可以添加我的微信,我会为每一位用户进行针对性指导!

另外,别忘了关注我:天罡gg ,发布新文不容易错过: https://blog.csdn.net/scm_2008

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

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

相关文章

c语言指针进阶(二)

目录 引言 函数指针数组 指向函数指针数组的指针 回调函数 引言 大家好,我是c语言boom成家宝,今天博主带来的依然是指针的进阶讲解。上一篇博客博主有介绍指针,数组指针,指针数组,以及函数指针的概念以及应用&…

【Azure】Azure成本管理:规划、监控、计算和优化成本 [文末送书]

开篇先来一个不是总结的总结:平衡成本与性能始终是一个重大挑战。(此处省略各种场景的解释) 文章目录 前言一、Azure 成本管理工具1.1 什么是成本管理1.2 成本管理的主要功能 二、Azure 中可能影响成本的因素2.1 影响成本的因素2.1.1 资源类型…

leetcode|math|9.172.69.50.

9. Palindrome Number to_string 就行 172. Factorial Trailing Zeroes 不能直接乘起来,会overflow!! 166! 就是要找166乘到1一共有几个5。5,10,15,25...都算。166/5就是算一共有几个5。但是25其实贡献了…

【周末闲谈】感受AI时代魅力,创意无界限

i 个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 文章目录 前言人工智能的应用领域问题求解逻辑推理与定理证明自然语言处理智能信息检索技术专家系统 人工智能的三大短板展望未来从专用智能向通用智能发展从人工智能向人机混合智能发展…

Jdk 版本升级

Jdk 版本升级(多版本配置) 一、配置多版本 首先如果系统第一次安装JDK 1.登录oracle官网Java Downloads | Oracle下载,此教程以Jdk1.8为例,一键下一步即可安装成功。 2.配置环境变量 然后在系统path路径中添加: %JAVA_HOME%…

单片机第一季:零基础10——串口通信和RS485

目录 1,串口通讯基础 1.1,同步和异步 1.2,并行和串行 1.3,单工、半双工与全双工通信 1.4,通信速率 2,单片机串口通讯 2.1,接口标准 2.2,通讯协议 2.3,串口…

834. 树中距离之和

给定一个无向、连通的树。树中有 n 个标记为 0…n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edges[i] [ai, bi]表示树中的节点 ai 和 bi 之间有一条边。 返回长度为 n 的数组 answer ,其中 answer[i] 是树中第 i 个节点与所有其他节点之间…

opencv环境搭建

1. 上网(你懂的,没有网装不了) 2. 参考视频:https://www.bilibili.com/video/BV1R44y157hW/?spm_id_from333.880.my_history.page.click&vd_source377867a48dd3d812b9d6521c8fc76de2 3. 这里我选择的是4.8的版本。 4. cmak…

charles中下载web证书

1.点击help,选中ssl Proxying ,点击Install Charles Root Certificate 2:点击”安装证书”按钮 3:点击”下一步”按钮 4:选中”将所有的证书都放入下列存储”,点击”游览”按钮 5:选中”受新任的根证书颁发机构”&…

day37-框架

0目录 框架 1.框架介绍 2. SSM三大框架简介 3.Mybatis 4.拓展 1.框架介绍 1.1 为什么使用框架? (1)框架效率高,成本低 (2)框架是别人写好的构建,我们只需学会如何使用它(可维护性…

C++(12):动态内存

除了自动和static对象外,C还支持动态分配对象。动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,这些对象才会销毁。 静态内存 用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。 栈内存 用来…

mysql_to_clickhouse同步方案调研

调研时间:2021年08月,之后是否出现优化方案未知 方式1:网上开源python脚本-----mysql-clickhouse-replication 安装参考:https://www.cnblogs.com/gomysql/p/11199856.html 软件路径:https://github.com/yymysql/my…

【C++STL】模拟实现vector容器

文章目录 前言一、vector的成员函数二、增删查改工作说明size()和capapcity()2.1reserve()2.2 resize()2.3 insert()2.4 erase()2.5 push_back()和pop_back() 三、[]重载和迭代器3.1…

ahut 周赛3

A.gzm判试卷 AhutOj 线段树(注意,一定要开到4*N,不然会RE) 单点更新(求区间最值) 单点更新不需要懒标记,区间修改是大量的点,需要懒标记 AC代码: #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace st…

Jmeter接口测试从0到1打通,从安装到接口测试实例(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Jmeter简介 J…

安装adobe系列产品,提示错误代码81解决办法

安装adobe系列软件&#xff0c;如Photoshop、Premiere Pro、Illustrator等时&#xff0c;出现如下图提示错误代码81&#xff0c;如何解决呢&#xff1f;一起来看看。 解决方法一 (重启电脑等待5分钟再安装&#xff01;) 解决方法二 应用程序中打开Adobe Creative Cloud 点击…

分布式文件系统与HDFS的shell操作及查看元数据

启动hadoop和hive的metastore查看sbin的目录下的文件 执行./start-all.sh 查看相关的进程

node.js重装问题

目录 问题一&#xff1a; 问题二&#xff1a; node.js安装分享&#xff1a; node.js重装参考&#xff1a; 问题一&#xff1a; 使用&#xff08;npm install express -g&#xff09;报错&#xff1a; config global --global -local are deprecated. Use --locationglobal …

【软件测试】Window与Linux系统下-初始化Git环境(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Window 初始化 Gi…

python开发ESP32之环境配置(一)

1、开发编辑器 Thonny 2、串口驱动安装 通过type-c线将芯片链接电脑&#xff0c; 右击我的点电脑——管理——设备管理器&#xff0c;查看驱动安装是否正常。 异常情况下需要安装驱动&#xff08;CP2102USBQD),根据个人电脑配置选择相应的驱动程序 安装失败的话&…