设计-RBAC数据库的设计与使用

文章-如何设计数据库表实现完整的RBAC(基于角色权限控制)
【RBAC】打造Web权限控制系统

这种关系的讲解,推荐一篇文章--[文章2]

  • 先看几张图,了解下RBAC
权限模型

ACL是用户直接拥有权限,RBAC是用户通过角色来拥有的权限。与权限之间是间接关系

图片.png
  • RBAC简化了用户和权限的关系,易扩展和维护
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png

数据库设计-- 要时刻牢记一个原则,用户是通过角色来拥有的权限。也就是用户是跟角色有关联,而跟权限没有关联

开发之前有必要先来分析一下数据表:
我们给角色赋权限,让角色与用户关联

- 1.用户表--users
- 2.权限表--permissions
- 3.角色表--roles
- 4.角色表和权限表--role_permission
- 5.用户和角色表--user_role
drop table `permissions` if EXISTS ;
CREATE TABLE IF NOT EXISTS `permissions` (
  `id` int(11) NOT NULL auto_increment,
  `Title` char(64) NOT NULL,
  `Description` text NOT NULL,
  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`http_path` text COLLATE utf8mb4_unicode_ci,
  PRIMARY KEY  (`id`),
  KEY `Title` (`Title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='权限表';

slug表示权限的名称,比如登录
http_path表示uri路径  比如 /login /logout

drop table `roles` if EXISTS ;
CREATE TABLE IF NOT EXISTS `roles` (
  `id` int(11) NOT NULL auto_increment,
  `Title` varchar(128) NOT NULL,
  `Description` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `Title` (`Title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色表';

drop table `role_permission` if EXISTS ;
CREATE TABLE IF NOT EXISTS `role_permission` (
  `role_id` int(11) NOT NULL,
  `premission_id` int(11) NOT NULL,
  PRIMARY KEY  (`role_id`,`premission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色权限表';



drop table `user_role` if EXISTS ;
CREATE TABLE IF NOT EXISTS `user_role` (
  `user_id` int(11) NOT NULL,
  `role_id` int(11) NOT NULL,
  PRIMARY KEY  (`user_id`,`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户角色表';


当然,还有user表。此处不再写
`role_permission`  表里可以使用    PRIMARY KEY  (`role_id`,`premission_id`)索引。无需自增id 。`user_role`表也是一样
在使用上:
`user_role` 的表,哪个用户想拥有哪个菜单的角色,就在这个表添加一条数据
`role_permission` 的表,哪个角色想拥有哪个权限,就在这个表添加一条数据

这样我们只是建好了表,但实际我们是要用于某些后台连接点击权限的
所以我们还需要两张表链接菜单表menus用户和链接菜单表role_menu

drop table `role_menu` if EXISTS ;
CREATE TABLE `role_menu` (
  `role_id` int(11) NOT NULL,
  `menu_id` int(11) NOT NULL,
  PRIMARY KEY  (`role_id`,`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户和链接菜单表';

drop table `menus` if EXISTS ;
CREATE TABLE `menus` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `order` int(11) NOT NULL DEFAULT '0' COMMENT '排序,这个表可以不要',
  `title` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `uri` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='链接菜单表';

`role_menu` 的表,哪个角色想拥有哪个菜单的权限,就在这个表添加一条数据
`menus表`

再进一步想,我们可以通过管理组来与用户关联.此处的组,可以理解为上面的角色。那么我们需要如下两个表。我们给组赋权限,让组与用户关联

drop table `groups` if EXISTS ;
CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(11) NOT NULL auto_increment,
  `Title` varchar(128) NOT NULL,
  `Description` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `Title` (`Title`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户组表';

drop table `group_permission` if EXISTS ;
CREATE TABLE IF NOT EXISTS `group_permission` (
  `premission_id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`http_path` text COLLATE utf8mb4_unicode_ci,
  PRIMARY KEY  (`group_id`,`premission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色组';

drop table `user_group` if EXISTS ;
CREATE TABLE IF NOT EXISTS `user_group` (
  `group_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY  (`user_id`,`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色组与用户表';

第二部分,使用篇

上面我们介绍完表关联设计后,接下来谈一谈怎么使用。使用的时候应该是某个角色role可以操作某些路由,所以应该有两个表。路由表menu和角色路由表role_menu

CREATE TABLE `role_menu` (
  `role_id` int(11) NOT NULL,
  `menu_id` int(11) NOT NULL,
  KEY `role_menu_role_id_menu_id_index` (`role_id`,`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `menu` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `order` int(11) NOT NULL DEFAULT '0',
  `title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `uri` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
表单层级表

此处我讲下路由限制的menu表,

parent_id就是本url属于哪个层级(这里用的是无限分类)
比如此处表单和test都在4Roles下面
order是列表显示的排序,序号小的在上面,此处表单在test上面
uri是角色可以访问的路由,自己通过代码限制即可
menu与role_menu`表的配合是指图中最坐变那排图标的显示

然后是 permissionsslughttp_path字段也是路由限制,permissions是表示直接在浏览器上输入路由不可以访问

要说明的是,如果不显示图标的情况,如果你没做路由访问限制,输入对应的uri其实也是可以访问页面的。

我们在显示某个用户的菜单列表的时候,
role_menu表中,role_id,menu_id都可以是多个
1.通过user.id查到role_menu.menu_id集合
2.然后查到符合menu_id集合的menu.id显示出来

在做某个用户访问某个路由的时候
role_user表中user_id是唯一的,role_id是可以多个的
1.通过user.id得到role_user.role_id
2.然后得到role_permissions表中的permissions.(表中的permissions_id和role_id都可以是多个)
3.去permissions表取出id对应的uri(即http_path)数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容