【第1期】SpringSecurity基于角色和权限的细粒度接口权限控制

SpringSecurity 细粒度权限控制

一、Role 和 Authority的区别

角色用来表示某一类权限的集合,权限粒度更小,方便细粒度控制

二、创建用户、角色、权限相关表:

CREATE TABLE `common_user` (
  `id` bigint(20) NOT NULL COMMENT '主键id',
  `login_name` varchar(32) CHARACTER SET utf8 NOT NULL COMMENT '登录名称',
  `password` varchar(2048) CHARACTER SET utf8 NOT NULL COMMENT '密码',
  `status` varchar(10) CHARACTER SET utf8 DEFAULT NULL COMMENT '认证状态:SUCCESS-认证通过;FAILED-认证失败;INIT-初始化;LOCKED-锁定;UNLOCKED-自动解锁',
  `phone` varchar(13) CHARACTER SET utf8 DEFAULT NULL COMMENT '手机号',
  `born` date DEFAULT NULL COMMENT '出生日期',
  `fail_count` int(2) DEFAULT NULL COMMENT '失败次数',
  `creator` varchar(20) CHARACTER SET utf8 NOT NULL COMMENT '创建人',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `modifier` varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT '修改人',
  `modify_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_login_name` (`login_name`) USING BTREE COMMENT 'login_name唯一索引',
  KEY `idx_phone` (`phone`) USING BTREE COMMENT 'phone索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

CREATE TABLE `common_user_role` (
  `id` bigint(20) NOT NULL COMMENT '主键id',
  `user_id` bigint(20) NOT NULL COMMENT '用户id',
  `role_id` bigint(20) NOT NULL COMMENT '角色id',
  `creator` varchar(20) NOT NULL COMMENT '创建人',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `modifier` varchar(20) DEFAULT NULL COMMENT '修改人',
  `modify_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_user_role` (`user_id`,`role_id`) USING BTREE COMMENT '用户角色组合索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色表';

CREATE TABLE `common_role` (
  `id` bigint(20) NOT NULL COMMENT '主键id',
  `name` varchar(32) NOT NULL COMMENT '角色名称',
  `desc` varchar(64) DEFAULT NULL COMMENT '角色描述',
  `creator` varchar(20) NOT NULL COMMENT '创建人',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `modifier` varchar(20) DEFAULT NULL COMMENT '修改人',
  `modify_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_name` (`name`) USING BTREE COMMENT '角色名称索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

CREATE TABLE `common_role_permission` (
  `id` bigint(20) NOT NULL COMMENT '主键id',
  `role_id` bigint(20) NOT NULL COMMENT '角色id',
  `permission_id` bigint(20) NOT NULL COMMENT '权限id',
  `creator` varchar(20) NOT NULL COMMENT '创建人',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `modifier` varchar(20) DEFAULT NULL COMMENT '修改人',
  `modify_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_role_permission` (`role_id`,`permission_id`) USING BTREE COMMENT '角色权限组合索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色权限表';

CREATE TABLE `common_role` (
  `id` bigint(20) NOT NULL COMMENT '主键id',
  `name` varchar(32) NOT NULL COMMENT '角色名称',
  `desc` varchar(64) DEFAULT NULL COMMENT '角色描述',
  `creator` varchar(20) NOT NULL COMMENT '创建人',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `modifier` varchar(20) DEFAULT NULL COMMENT '修改人',
  `modify_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_name` (`name`) USING BTREE COMMENT '角色名称索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

三、给资源授予权限(角色或权限)

注意:角色 (“ADMIN”,“MEMBER”,“GUEST”),在SpringSecurity中设置时需要添加前缀ROLE_,所以这里存储有2种方案
第一种:数据库存储角色名称,没有ROLE_的前缀,如下图
在这里插入图片描述
那么,在角色加载的时候,需要补上前缀ROLE_
在这里插入图片描述
接口配置角色访问策略时,无需添加ROLE_前缀了,SpringSecurity在进行角色权限判断时会自动加ROLE_前缀,这样配置:
在这里插入图片描述
配置后,当前用户如果登录成功,便有了该接口的访问权限(需要行政区划平铺数据的私信):
在这里插入图片描述

第二种:数据库存储角色的时候就添加ROLE_前缀,这样在角色加载时就无需再添加ROLE_前缀了,不再赘述

三、角色与权限结合起来控制接口的访问权限

例如:角色ROLE必须是MEMBER,并且有权限division:flat_cities才能访问该接口,接口处这样配置:
在这里插入图片描述
当前用户已设置MEMBER角色和division:flat_cities权限,访问试试:
此时,出了点小插曲,登录失效了,这里就是SpringSecurity+RSA+JWT+Redis的权限控制和登录退出控制
在这里插入图片描述
通过接口先登录,获取Token,登录成功后响应的header返回了X-Auth-Token令牌,每次请求携带该令牌即可访问接口,仅仅是允许访问,不代表有权限,权限还是通过角色+权限来控制的
在这里插入图片描述
接下来访问接口:
在这里插入图片描述
如果:把当前用户的角色保留,权限去掉division:flat_cities,会怎样?我这里将权限改错等同于去掉了,因为接口配置的权限是division:flat_cities
在这里插入图片描述
再次携带当前登录用户的Token访问接口,发现就无权访问了:
在这里插入图片描述

二、细粒度的资源控制
authenticated():通过认证的用户都可以访问

permitAll():允许所有人访问,即使未登录

authorizeRequests():更细粒度的控制

access(String): SpEL:Spring表达式

​ .access(“hasRole(‘大师’) AND hasAuthority(‘user:delete’) OR hasIpAddress(‘192.168.0.1’)”)

四、细粒度的资源控制必要的注解

  • 开启注解控制权限模式

@EnableWebSecurity:开启 Spring Security 注解
@EnableGlobalMethodSecurity(prePostEnabled=true):开启全局的细粒度方法级别权限控制功能

几个权限检查注解

@PreAuthorize:方法执行前检查
@PreAuthorize(“hasRole(‘ADMIN’)”)
@PostAuthorize:方法执行后检查,失败抛异常
@PostAuthorize:允许方法调用,但是,如果表达式结果为false抛出异常
@PostAuthorize("returnObject.user.usernameprincipal.username")
@PostFilter:允许方法调用,但是按照表达式过滤方法结果
@PostFilter("returnObject.user.sex
’男’ ")
@PreFilter:允许方法调用,但必须在进入方法前过滤输入值
@Secured:拥有指定角色才可以访问方法
@Secured(‘ADMIN’) 等价于 @PreAuthorize(“hasRole(‘ADMIN’)”)

五、细粒度的资源控制注解中可写的表达式

所有能使用的表达式见下面文档连接:
https://docs.spring.io/spring-security/site/docs/4.0.1.RELEASE/reference/htmlsingle/#el-common-built-in

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详细教程 - 从零开发 鸿蒙harmonyOS应用 第四节 (鸿蒙Stage模型 登录页面 ArkTS版 推荐使用)

在鸿蒙OS中,Ability是应用程序提供的抽象功能,可以理解为一种功能。在应用程序中,一个页面即一种能力,如登录页面,即具有登录功能的能力。以下是对鸿蒙新建项目的登录代码功能的详细解读和工作流程的描述: …

人工智能在红斑狼疮应用主要以下4个方面

人工智能(Artificial Intelligence, AI)在医学领域的应用已取得了一定的进展。红斑狼疮(Systemic Lupus Erythematosus, SLE)是一种免疫系统性疾病,对该疾病进行诊断和治疗是一个复杂的过程。人工智能可以发挥作用&…

棒材生产线的7大智能化提升方向 蓝鹏可定制3大类

轧钢智能化控制体系,实行智能化轧钢,提高产品合格率,满足棒材生产线对于产品精度、生产产量、远程集中操控的需求,是钢厂一直致力于实现的目标,目前可从七大方向对棒材产线的智能化方向进行提升。 棒材生产线有以下智…

CRM客户管理系统-超详细介绍

1. CRM概述 CRM(Customer Relationship Management)客户关系管理,是一种以客户为中心,通过与客户建立持久的、互惠互利的合作关系,从而提高企业整体绩效的管理方法。CRM系统是支持CRM战略的软件工具,用于…

用Pyinstaller打包深度学习算法为独立的可执行程序

前言:随着深度学习算法的流行,在传统工业软件计算领域,传统算法逐渐被深度学习算法给代替,但由于基于python的深度学习算法十分依赖python环境以及例如Pytorch、Scikit-learning、Keras等机器学习库,将深度学习算法运用…

HarmonyOS4.0从零开始的开发教程17给您的应用添加通知

HarmonyOS(十五)给您的应用添加通知 通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息,帮助用户高效地处理任务。应用可以通过通知接口发送通知消息,用户可以通过通知栏查看通知内容,也可以点击通知来打开应…

linux 查看服务启动时间

文章目录 linux 查看服务启动时间参数解析 linux 查看服务启动时间 [root104 ~]# ps -o lstart -p ps -ef |grep -v grep |grep "zookeeper"|awk {print$2}STARTED Fri Dec 15 16:54:10 2023参数解析 linux 命令中 ps -ef 详解 ps -ef表示查看全格式的进程。 ps …

UE5 PlaceActor

⚠️ 重点 PlaceActors 需在引擎初始化之后 但,单为这一个功能,更改整个模块的启动顺序,也不太划算 更好的办法是,启动顺序保持正常(如"LoadingPhase": "Default" ),然后…

超燃超欢乐!修仙喜剧动画《师兄啊师兄》第二季稳健开播

12月14日,备受瞩目的《师兄啊师兄》第二季终于稳健开播!首播两集连放,同时第一季全13集限免,不仅便于新观众丝滑入坑,老观众也可以二刷重温,可以说是非常良心了! 《师兄啊师兄》改编自人气网络小…

LeetCode(63)旋转链表【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 旋转链表 1.题目 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2&…

PE硅芯管抗紫外线和微生物侵害,对水质不会造成任何影响

PE硅芯管是一种优质的管道材料,具有出色的抗紫外线和微生物侵害的能力。这种管道材料采用特殊的生产工艺,添加了硅质材料,从而增强了管道的耐久性。 由于其抗紫外线性能强,PE硅芯管即使在户外长时间暴露于阳光下也不会出现老化、…

基于ssm培训学校教学管理平台论文

摘 要 社会的进步,教育行业发展迅速,人们对教育越来越重视,在当今网络普及的情况下,教学管理模式也开始逐渐网络化,学校开始网络教学管理模式。 本文研究的培训学校教学管理平台基于SSM框架,采用Java技术和…

关于主持知识竞赛的几点体会

知识竞赛被许多人认为不太好主持,因为既然是竞赛,总会有输有赢,而参赛各队又多是有备而来,场上一派剑拔弩张的气势。囿于这样的气氛中,再加上知识竞赛的固定模式,主持人很难有所发挥,因此&#…

6个超好用的小众图片素材网站,高清、免费,值得收藏~

推荐几个超好用的图片素材网站,免费下载,还可以商用,建议收藏哦~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 我推荐过很多次的设计素材网站,除了设计类素材,还有很多自媒体可以用到的高清图片、背景…

win11装了Ubuntu系统,切换到 wim11,蓝牙耳机显示已连接,但耳机无声音,且声音外放正常

打开 设置>蓝牙和其它设备 ,发现耳机是连接正常的,点击页面的 设备 发现蓝牙耳机已经被识别音频,也可能没有被识别为音频设备,而是显示其他设备,这样会导致输出设备上没有耳机这一选项,则点击设备和打印…

当你在浏览器中键入“https://www.google.com”并按 Enter 键时会发生什么?

互联网是我们每天使用的奇迹,在其表面之下隐藏着一层层的复杂性。有没有想过当你输入一个URL时,幕后会发生什么?今天,让我们满足我们的好奇心,揭开由一个简单的命令启动的错综复杂的进程网络:键入“https:/…

世微 锂电池保护IC DW01 充电器检测过充保护SOT23-6

一、 描述 DW01A 是一个锂电池保护电路,为避免锂电池因过充电、过放电、电流过大导致电池寿命缩短或电池被损坏而设计的。它具有高精确度的电压检测与时间延迟电路。 二、 主要特点 工作电流低 过充检测 4.3V,过充释放 4.05V; 过放检测 2.4…

5.1 C++11强类型枚举

一、C枚举的缺陷 1.类型冲突 枚举值和类型都是全局可见的, 与正常C的namespace、类等都是格格不入的,并且还容易导致冲突。 enum Type { General, Light, Medium, Heavy }; enum Category { General, Pistol, MachineGun, Cannon }; 如果在相同作用域…

0x21 树与图的遍历

0x21 树与图的遍历 树与图最常见的储存方式就是使用一个邻接表保存它们的边集。邻接表以head数组为表头,使用ver和edge数组分别存储边的终点和权值,使用next数组模拟链表指针(就像我们在0x13节中讲解邻接表所给出的代码那样)。 …

计算机网络:应用层(二) Web与http协议

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…