設(shè)計(jì)-RBAC數(shù)據(jù)庫(kù)的設(shè)計(jì)與使用

文章-如何設(shè)計(jì)數(shù)據(jù)庫(kù)表實(shí)現(xiàn)完整的RBAC(基于角色權(quán)限控制)
【RBAC】打造Web權(quán)限控制系統(tǒng)

這種關(guān)系的講解失受,推薦一篇文章--[文章2]

  • 先看幾張圖引润,了解下RBAC
權(quán)限模型

ACL是用戶直接擁有權(quán)限,RBAC是用戶通過(guò)角色來(lái)?yè)碛械臋?quán)限。與權(quán)限之間是間接關(guān)系

圖片.png
  • RBAC簡(jiǎn)化了用戶和權(quán)限的關(guān)系禁荒,易擴(kuò)展和維護(hù)
圖片.png
圖片.png
圖片.png
圖片.png
圖片.png
圖片.png

數(shù)據(jù)庫(kù)設(shè)計(jì)-- 要時(shí)刻牢記一個(gè)原則,用戶是通過(guò)角色來(lái)?yè)碛械臋?quán)限寺庄。也就是用戶是跟角色有關(guān)聯(lián)耀石,而跟權(quán)限沒(méi)有關(guān)聯(lián)

開(kāi)發(fā)之前有必要先來(lái)分析一下數(shù)據(jù)表:
我們給角色賦權(quán)限,讓角色與用戶關(guān)聯(lián)

- 1.用戶表--users
- 2.權(quán)限表--permissions
- 3.角色表--roles
- 4.角色表和權(quán)限表--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='權(quán)限表';

slug表示權(quán)限的名稱硬爆,比如登錄
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='角色權(quán)限表';



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='用戶角色表';


當(dāng)然欣舵,還有user表。此處不再寫(xiě)
`role_permission`  表里可以使用    PRIMARY KEY  (`role_id`,`premission_id`)索引缀磕。無(wú)需自增id 缘圈。`user_role`表也是一樣
在使用上:
`user_role` 的表,哪個(gè)用戶想擁有哪個(gè)菜單的角色袜蚕,就在這個(gè)表添加一條數(shù)據(jù)
`role_permission` 的表糟把,哪個(gè)角色想擁有哪個(gè)權(quán)限,就在這個(gè)表添加一條數(shù)據(jù)

這樣我們只是建好了表牲剃,但實(shí)際我們是要用于某些后臺(tái)連接點(diǎn)擊權(quán)限的
所以我們還需要兩張表鏈接菜單表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 '排序遣疯,這個(gè)表可以不要',
  `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` 的表,哪個(gè)角色想擁有哪個(gè)菜單的權(quán)限凿傅,就在這個(gè)表添加一條數(shù)據(jù)
`menus表`

再進(jìn)一步想缠犀,我們可以通過(guò)管理組來(lái)與用戶關(guān)聯(lián).此處的組数苫,可以理解為上面的角色。那么我們需要如下兩個(gè)表辨液。我們給組賦權(quán)限虐急,讓組與用戶關(guān)聯(lián)

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='角色組與用戶表';

第二部分,使用篇

上面我們介紹完表關(guān)聯(lián)設(shè)計(jì)后滔迈,接下來(lái)談一談怎么使用止吁。使用的時(shí)候應(yīng)該是某個(gè)角色role可以操作某些路由,所以應(yīng)該有兩個(gè)表亡鼠。路由表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;
表單層級(jí)表

此處我講下路由限制的menu表赏殃,

parent_id就是本url屬于哪個(gè)層級(jí)(這里用的是無(wú)限分類)
比如此處表單和test都在4Roles下面
order是列表顯示的排序敷待,序號(hào)小的在上面间涵,此處表單在test上面
uri是角色可以訪問(wèn)的路由,自己通過(guò)代碼限制即可
menu與role_menu`表的配合是指圖中最坐變那排圖標(biāo)的顯示

然后是 permissionsslug榜揖、http_path字段也是路由限制勾哩,permissions是表示直接在瀏覽器上輸入路由不可以訪問(wèn)

要說(shuō)明的是,如果不顯示圖標(biāo)的情況举哟,如果你沒(méi)做路由訪問(wèn)限制思劳,輸入對(duì)應(yīng)的uri其實(shí)也是可以訪問(wèn)頁(yè)面的。

我們?cè)陲@示某個(gè)用戶的菜單列表的時(shí)候妨猩,
role_menu表中潜叛,role_id,menu_id都可以是多個(gè)
1.通過(guò)user.id查到role_menu.menu_id集合
2.然后查到符合menu_id集合的menu.id顯示出來(lái)

在做某個(gè)用戶訪問(wèn)某個(gè)路由的時(shí)候
role_user表中user_id是唯一的,role_id是可以多個(gè)的
1.通過(guò)user.id得到role_user.role_id
2.然后得到role_permissions表中的permissions.(表中的permissions_id和role_id都可以是多個(gè))
3.去permissions表取出id對(duì)應(yīng)的uri(即http_path)數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壶硅,一起剝皮案震驚了整個(gè)濱河市威兜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庐椒,老刑警劉巖椒舵,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異约谈,居然都是意外死亡笔宿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)棱诱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泼橘,“玉大人,你說(shuō)我怎么就攤上這事迈勋【婷穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵粪躬,是天一觀的道長(zhǎng)担败。 經(jīng)常有香客問(wèn)我昔穴,道長(zhǎng),這世上最難降的妖魔是什么提前? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任吗货,我火速辦了婚禮,結(jié)果婚禮上狈网,老公的妹妹穿的比我還像新娘宙搬。我一直安慰自己,他們只是感情好拓哺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布勇垛。 她就那樣靜靜地躺著,像睡著了一般士鸥。 火紅的嫁衣襯著肌膚如雪闲孤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天烤礁,我揣著相機(jī)與錄音讼积,去河邊找鬼。 笑死脚仔,一個(gè)胖子當(dāng)著我的面吹牛勤众,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲤脏,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼们颜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了猎醇?” 一聲冷哼從身側(cè)響起窥突,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姑食,沒(méi)想到半個(gè)月后波岛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡音半,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年则拷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曹鸠。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煌茬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彻桃,到底是詐尸還是另有隱情坛善,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站眠屎,受9級(jí)特大地震影響剔交,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜改衩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一岖常、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葫督,春花似錦竭鞍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至洽胶,卻和暖如春晒夹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妖异。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工惋戏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留领追,地道東北人他膳。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绒窑,于是被迫代替她去往敵國(guó)和親棕孙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容