前言

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

设计权限

设计权限之前依然先梳理下权限模块需求:(下文中模块可以理解为前端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开源项目)相关推荐

  1. 【权限管理框架】一文看懂Shiro权限管理框架!

    文章目录 1.JavaWeb中的权限控制 2.权限框架核心知识ACL和RBAC 2.1.ACL和RBAC简介 2.2主流权限框架介绍 3.Shiro架构和基本概念 3.1.Shiro的4大核心模块 3 ...

  2. 四句话看懂等保2.0测评结果

    等保2.0自2019年12月1日开始正式实施,其中测评结果由1.0时代的符合.基本符合.不符合改为2.0时代的优.良.中.差四个等级,测评及格线也由原来的60分提高到了70分. 如何快速看懂等保2.0 ...

  3. web.xml文件位于web项目的目录结构中的_看完这篇,别人的开源项目结构应该能看懂了...

    我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题. 很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙, ...

  4. 看完这篇,别人的开源项目结构应该能看懂了

    我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题. 很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙, ...

  5. 在阿里工作5年了,看完这篇,别人的开源项目结构应该能看懂了

    很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙,不知道应该以一个什么样的思路去学习和吸收别人的项目. 好,今天熬夜肝了这篇文章,和大家一起来交流探讨一下,不足之处也请小伙伴们批 ...

  6. 使用这些思路与技巧,我读懂了多个优秀的开源项目

    好的,让我们开始出发吧!在进入正题之前,我们先来个读源码前的 灵魂四连问 热热身. 一.灵魂四连问 1.1 为什么要读源代码 1.2 如何选择项目 1.3 如何阅读源码 1.4 有实际的案例么 既然前 ...

  7. AWS攻略——一文看懂AWS IAM设计和使用

    大纲 1 作用 2 初创公司IAM成长记 2.1 根用户(Root User) 2.2 用户(User) 2.2.1 管理员 2.2.2 普通用户 2.2.3 规模膨胀 2.3 用户组(User Gr ...

  8. 一文看懂AWS IAM设计和使用

    大纲 1 作用 2 初创公司IAM成长记 2.1 根用户(Root User) 2.2 用户(User) 2.2.1 管理员 2.2.2 普通用户 2.2.3 规模膨胀 2.3 用户组(User Gr ...

  9. flask POST请求,数据入库,文件上传,一文看懂,3天掌握Flask开发项目系列博客之三

    flask 实现ajax 数据入库 在正式编写前需要了解一下如何在 python 函数中去判断,一个请求是 get 还是 post. python 文件代码如此所示: # route()方法用于设定路 ...

  10. 关于标志的精思巧形(二)----如何“看懂”标志

    ----精思巧形LOGO  设计师如何看懂标志 设计师如何看懂标志 很多标志设计学员说看不懂标志,我之前写过三篇简单的博文,来帮助设计师自我检查标志设计能力,如果要说自己能独立完成标志设计,我们可以从 ...

最新文章

  1. Parabola(抛物线)
  2. ACS AD 和本地验证SSL ×××
  3. 【数学】概念的理解 —— 有序对(ordered pair)
  4. 大一的时候我上铺一哥们天天说梦话,一夜,他羞涩的说:“我怀孕了。”我们全体晕倒。...
  5. JSF –渴望的CDI bean
  6. access month函数用法_小白进阶必备的10组函数公式实用技巧解读,有案例和详情解读哦!...
  7. js继承实现 狗类继承动物类
  8. DPVS_吊打面试官的项目——DPVS
  9. 小云(云层-陈霁)的发展史
  10. 微信公众号文章排版php,微信内容排版工具总结
  11. PAT a1125
  12. Effective C++记录(6):Explicitly disallow the use of compiler-generated functions you do not want
  13. C#(十三)之字符串string
  14. 苹果手机天气温度显示80度_iPhone如何做到锁屏桌面显示天气?花上一分钟,亮屏就能看天气...
  15. 关于最近很火的Python圣诞树
  16. Centos 7分辨率调整成适应虚拟机屏幕大小
  17. RabbitMQ从入门到实践
  18. python最难的地方_最令人头疼的 Python 问题
  19. GDI函数 坐标系综述
  20. 杰理之VCOM按键复位【篇】

热门文章

  1. 计算机毕业设计选什么题目好?springboot 大学生创客平台
  2. java 字符串MD5的加密
  3. 舔狗日记之好一条舔狗
  4. 中间件——centos7.6下部署kafka_2.12解压版
  5. 晚饭后和黄*一起出去走了一大圈
  6. 彩色颜料背景的团建活动策划PPT模板
  7. 【苹果信息推送imessage】安装软件需要需要文件夹路径?
  8. 论文修改建议 (ZhangJH 20211124 哪些实验可以对比)
  9. 2020年还能找到一份高薪的工作嘛?
  10. 完美解决please restart word to load mathtype addin properly的问题。