【第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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

C#学习笔记 - C#基础知识 - C#从入门到放弃

C# 持续更新中~~ 上次更新日期:20231215 第1节 C# 简单介绍1.1 C# 是什么1.2 C# 强大的编程功能1.3 C# 发展史1.4 C#与Java区别 第2节 C#基本语法2.1 C#程序结构2.2 C# 结构解析2.3 命名空间及标识符、关键字2.3.1 别名的使用2.3.2 标识符2.3.3 C#关键字 第3节 变量…

jmeter,动态参数之随机数、随机日期

通过函数助手,执行以下配置: 执行后的结果树: 数据库中也成功添加了数据,对应字段是随机值:

gitbash下载安装

参考教程 零、下载 官网地址 2.43.0win64 链接:https://pan.baidu.com/s/16urs_nmky7j20-qNzUTTkg 提取码:7jaq 一、安装 图标组件(Additional icons):选择是否创建桌面快捷方式;桌面浏览(Win…

国标级联/流媒体音视频平台EasyCVR设备录像下载异常该如何解决?

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支…

视频推拉流平台EasyDSS点播文件播放请求添加token验证的实现方法

EasyDSS视频直播点播平台可提供一站式的视频推拉流、转码、点播、直播、播放H.265编码视频等服务,搭配RTMP高清摄像头使用,可将设备的实时流推送到平台上,实现无人机视频推流直播等应用。今天我们来介绍下EasyDSS系统点播文件播放请求添加tok…

MQTT 介绍与学习 —— 筑梦之路

之前写过的相关文章: MQTT协议(转载)——筑梦之路_mqtt url-CSDN博客 k8s 部署mqtt —— 筑梦之路-CSDN博客 CentOS 7 搭建mqtt服务——筑梦之路_腾讯云宝塔搭 centos 7.9.2009 x86_64 建标准mqtt服务器-CSDN博客 mqtt简介 MQTT&#xff…

轻量封装WebGPU渲染系统示例<50>- Json数据描述材质等场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene2.ts 当前示例运行效果: 此示例基于此渲染系统实现,当前示例TypeScript源码如下: json场景数据: {"renderer": {"mtplE…

Java网络编程,使用UDP实现TCP(三), 基本实现四次挥手

简介 四次挥手示意图 在四次挥手过程中,第一次挥手中的Seq为本次挥手的ISN, ACK为 上一次挥手的 Seq1,即最后一次数据传输的Seq1。挥手信息由客户端首先发起。 实现步骤: 下面是TCP四次挥手的步骤: 第一次挥手&…

LV.13 D4 uboot使用 学习笔记

一、uboot环境变量命令 1.1 uboot模式 自启动模式 uboot 启动后若没有用户介入,倒计时结束后会自动执行自启动环境变量 (bootcmd) 中设置的命令(一般作加载和启动内核) 交互模式 倒计时结束之前按下任意按键 uboot 会进…

异地现场工控设备,如何实现远程配置、调试?

南京某企业专注于工业物联领域,在相关项目中往往会在各个点位部署基于Linux系统的中控主机,实现各类物联设备信息的采集、汇总。但是,由于各点位分散多地,且数量达到了上百个,虽然中控主机具备4G物联网接入能力&#x…

【Vue】elementUI表格,导出Excel

系列文章 【Vue】vue增加导航标签 本文链接:https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接:https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue,在Windows IIS平台…

设计模式——策略模式(Strategy Pattern)

概述 策略模式又叫政策模式,是一种对象行为型模式。它是将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。策略模式的主要目的是将算法的定义与使用分开,也就是将算法的行为和环…

小程序使用Nodejs作为服务端,Nodejs与与MYSQL数据库相连

小程序使用Nodejs作为服务端,Nodejs与MYSQL数据库相连 一、搭建环境二、配置Nodejs三、与小程序交互四、跨域处理/报错处理五、nodejs连接mysql数据库六、微信小程序连接nodejs报错七、小程序成功与服务端相连,且能操作数据库一、搭建环境 新建空文件夹:Win + R进入cmd命令界…

Unity 控制刚体的移动与旋转的方法

在场景创建一个Cube,并添加刚体,如图: 编写脚本: using System.Collections; using System.Collections.Generic; using UnityEngine;[RequireComponent(typeof(Rigidbody))] public class RibRotate : MonoBehaviour {//private Vector3 mo…

C语言----文件操作(二)

在上一篇文章中我们简单介绍了在C语言中文件是什么以及文件的打开和关闭操作,在实际工作中,我们不仅仅是要打开和关闭文件,二是需要对文件进行增删改写。本文将详细介绍如果对文件进行安全读写。 一,以字符形式读写文件&#xff…

中通单号查询,中通快递物流查询,对需要的单号进行备注

批量查询中通快递单号的物流信息,对需要的单号进行备注。 所需工具: 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左上角的“…

iOS使用CoreText完成txt阅读器

CoreText是一个高效处理字符和字形转换和进行文字排版的框架,API基于C语言。 常见的CoreText类介绍 (1)、CFAttributedStringRef 属性字符串,用于存储需要绘制的文字字符和字符属性 (2)、CTFramesetterR…

JVM学习之JVM概述

JVM的整体结构 Hotspot VM是目前市面上高性能虚拟机代表作之一 它采用解释器与即时编译器并存的架构 在今天,Java程序的运行性能已经达到了可以和C/C程序一较高下的地步 Java代码执行流程 具体图为 JVM架构模型 Java编译器输入的指令流基本上是一种基于 栈的指令…

大创项目推荐 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…