一句SQL看懂权限权限设计(mayfly-go开源项目)

2023-11-05 17:10

本文主要是介绍一句SQL看懂权限权限设计(mayfly-go开源项目),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

上次我们讲了如何实现安全登录,登录完成后会对用户权限进行查询(权限包含:系统权限(路由权限)、资源按钮权限)。 那在本项目中作者是如何设计权限的?

设计权限

设计权限之前依然先梳理下权限模块需求:(下文中模块可以理解为前端router)

  • 应该有基本模块权限。(普通用户能进来)* 应该有角色,角色和资源 关系是 N:N* 用户归属于某个角色, 角色和用户 关系是 N:N### 资源表

里面会记录出资源类型、状态、标识码(和前端资源ID对应)、meta 其他额外信息等。

目标是:通过此表能准确判断出某个资源详细信息。

 // 资源表(路由 或者 按钮)
CREATE TABLE `t_sys_resource` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`pid` int(11) NOT NULL COMMENT '父节点id',`type` tinyint(255) NOT NULL COMMENT '1:菜单路由;2:资源(按钮等)',`status` int(255) NOT NULL COMMENT '状态;1:可用,-1:禁用',`name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '名称',`code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '菜单路由为path,其他为唯一标识',`weight` int(11) DEFAULT NULL COMMENT '权重顺序',`meta` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '元数据',`creator_id` bigint(20) NOT NULL,`creator` varchar(255) COLLATE utf8mb4_bin NOT NULL,`modifier_id` bigint(20) NOT NULL,`modifier` varchar(255) COLLATE utf8mb4_bin NOT NULL,`create_time` datetime NOT NULL,`update_time` datetime NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='资源表' 

表中存放数据如下:

角色表

角色表 记录 系统中存在的角色。核心:角色类型、状态等

 CREATE TABLE `t_sys_role` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(16) COLLATE utf8mb4_bin NOT NULL,`code` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '角色code',`status` tinyint(255) DEFAULT NULL,`remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,`type` tinyint(2) NOT NULL COMMENT '类型:1:公共角色;2:特殊角色',`create_time` datetime DEFAULT NULL,`creator_id` bigint(20) DEFAULT NULL,`creator` varchar(16) COLLATE utf8mb4_bin DEFAULT NULL,`update_time` datetime DEFAULT NULL,`modifier_id` bigint(20) DEFAULT NULL,`modifier` varchar(16) COLLATE utf8mb4_bin DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='角色表' 

存放数据如下: (基础权限 都分配给一个角色)

角色-资源 关联表

记录用户和角色的对应关系

CREATE TABLE `t_sys_role_resource` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`role_id` bigint(20) NOT NULL,`resource_id` bigint(20) NOT NULL,`creator_id` bigint(20) unsigned DEFAULT NULL,`creator` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL,`create_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=526 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='角色资源关联表' 

账号-角色 关联表

记录 账号 和 角色映射关系

CREATE TABLE `t_sys_account_role` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Id',`account_id` bigint(20) NOT NULL COMMENT '账号id',`role_id` bigint(20) NOT NULL COMMENT '角色id',`creator` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL,`creator_id` bigint(20) unsigned DEFAULT NULL,`create_time` datetime NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='账号角色关联表' 

查询用户权限SQL

子查询1: 查找用户所有资源id

含义:通过userid_id, 查询出role_id列表,再查询出 resource_id 列表。

SELECT DISTINCT ( rmb.resource_id ) 
FROMt_sys_account_role pJOIN t_sys_role r ON p.role_Id = r.id AND p.account_id = 1 AND r.STATUS = 1JOIN t_sys_role_resource rmb ON rmb.role_id = r.id 
/* t_sys_role_resource 记录 账号 和 用户映射关系 t_sys_role 角色表 记录 系统中存在的角色 t_sys_role_resource 角色资源表 这个查询的含义是 查找某个用户下的所有资源ID*/ 

子查询2: 查询公共资源(所有账号都应该有的权限)

角色中表Code字段是 ‘COMMON’ 开头的所有资源列表。

SELECTr.id 
FROMt_sys_resource rJOIN t_sys_role_resource rr ON r.id = rr.resource_idJOIN t_sys_role ro ON rr.role_id = ro.id AND ro.STATUS = 1 AND ro.CODE LIKE 'COMMON%'/* t_sys_resource 资源表(路由 或者 按钮)t_sys_role_resource 记录 账号 和 用户映射关系t_sys_role 角色表 记录 系统中存在的角色 这个查询的含义是: 查找公共角色下的资源*/ 

最终: 最终用户资源列表

通过合并前面两步查询(UNION),获得所有资源列表ID,从资源表中查询详细信息。

SELECTm.id,m.pid,m.weight,m.NAME,m.CODE,m.meta,m.type,m.STATUS 
FROMt_sys_resource m 
WHEREm.STATUS = 1 AND m.id IN (SELECT DISTINCT( rmb.resource_id ) FROMt_sys_account_role pJOIN t_sys_role r ON p.role_Id = r.id AND p.account_id = 1 AND r.STATUS = 1JOIN t_sys_role_resource rmb ON rmb.role_id = r.id UNIONSELECTr.id FROMt_sys_resource rJOIN t_sys_role_resource rr ON r.id = rr.resource_idJOIN t_sys_role ro ON rr.role_id = ro.id AND ro.STATUS = 1 AND ro.CODE LIKE 'COMMON%' ) 
ORDER BYm.pid ASC,m.weight ASC 

最终查询结果如下:

相关数据库查询知识

上一个经典联表查询图:

如何记住这些查询呢? 这些查询结果都是笛卡尔积查询子集,从子集中按照一定条件捞出来。

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

这篇关于一句SQL看懂权限权限设计(mayfly-go开源项目)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/351295

相关文章

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

MySQL zip安装包配置教程

《MySQLzip安装包配置教程》这篇文章详细介绍了如何使用zip安装包在Windows11上安装MySQL8.0,包括下载、解压、配置环境变量、初始化数据库、安装服务以及更改密码等步骤,感兴趣的朋... 目录mysql zip安装包配置教程1、下载zip安装包:2、安装2.1 解压zip包到安装目录2.2

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英