ThinkPHP中RBAC資料庫詳解
阿新 • • 發佈:2019-01-31
RBAC許多人聽到後會覺得很頭疼,不知道這是什麼東西。用英文來講的話就是Role-Based Access Control,用中文來說就是——基於角色的許可權訪問控制。呵呵,是不是聽的頭暈了?沒那麼複雜。你只需要瞭解一點,它是來控制使用者組許可權的就得了,有的使用者組的使用者可以新增,但是有的使用者組的使用者卻可以,就是這樣一個簡單的東西。如果再搞得大家頭暈一點的話,他還包括什麼:安全攔截器,認證管理器...等等概念咯。我覺得如果僅僅是要使用的話,這些東西在最開始的時候其實沒必要了解。只要清楚,怎麼用的,以後對於這些概念即可以一看就懂,一用就通。
大家在電影當中看到過一種場景嗎?——需要兩個人的密碼卡,指紋和眼球掃描才能夠開啟金庫。
或者說是在現實生活中:一個營業人員能進行一些操作,但是輸入錯誤或者一些特殊情況下面,會叫“經理,許可權不夠”。這個時候,他們的經理就會拿著自己的IC卡過來,然後輸入密碼,該營業員就能夠進行該項操作了。
類似於這樣一種兩個身份登陸認證才能進行操作的功能,目前ThinkPHP2.0版本中,還不能實現。如果想使用這樣的功能,只有大家自己寫一個操作類或者是在ThinkPHP進行修改或者擴充套件了。
廢話不多說,我們先去下載一個ThinkPHP的框架(注:在1.5版本以後ThinkPHP關於RBAC等擴充套件類就不包含在核心包當中了,如果大家要下載的話可以去下載最新的ThinkPHP2.0帶擴充套件、示例和文件完整包)。下載地址如下:http://www.thinkphp.cn/Down/(別下成核心包了哦!)
下載解壓完成,將其放入我們的根目錄或者子目錄下。
我們先跳過去這一段,講一個許可權化分中最重要,大家最容易弄混的地方,就是RBAC需要用到的表和欄位。我們先來了解一下RBAC需要用到的資料表。將建立一個五張表,這五張表分別是:
1. 使用者表(包含三個欄位使用者編號,使用者名稱和使用者密碼)
2. 使用者組表(使用者組編號和名字)
3. 使用者與組的對應關係表(組編號和使用者編號)
4. 節點表(節點編號,名字,註釋,父路徑編號,等級)(注:這個表很容易將人搞暈)
5. 許可權表(組編號,節點編號,父路徑編號,等級)
01
|
-- 表的結構 `think_access`此表為五張表中的許可權表
|
02
|
CREATE TABLE IF NOT EXISTS
`think_access` (
|
03
|
`role_id`
smallint(6) unsigned NOT NULL,
|
04
|
`node_id`
smallint(6) unsigned NOT NULL,
|
05
|
`level`
tinyint(1) NOT NULL,
|
06
|
`pid`
int(11) DEFAULT NULL,
|
07
|
KEY
`groupId` (`role_id`), |
08
|
KEY
`nodeId` (`node_id`)
|
09
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
10
|
-- 表的結構 `think_node`此表為五張表中的節點表
|
11
|
CREATE TABLE IF NOT EXISTS
`think_node` (
|
12
|
`id`
smallint(6) unsigned NOT NULL AUTO_INCREMENT,
|
13
|
`name`
varchar(20) NOT NULL,
|
14
|
`title`
varchar(50) DEFAULT NULL, |
15
|
`pid`
smallint(6) unsigned NOT NULL,
|
16
|
`level`
tinyint(1) unsigned NOT NULL,
|
17
|
PRIMARY
KEY (`id`),
|
18
|
KEY
`level` (`level`),
|
19
|
KEY `pid`
(`pid`),
|
20
|
KEY `name`
(`name`)
|
21
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8
AUTO_INCREMENT=7 ;
|
22
|
-- 表的結構 `think_role`此表為五張表中的使用者組表
|
23
|
CREATE TABLE IF NOT EXISTS
`think_role` (
|
24
|
`id`
smallint(6) unsigned NOT NULL AUTO_INCREMENT,
|
25
|
`name`
varchar(20) NOT NULL,
|
26
|
PRIMARY
KEY (`id`),
|
27
|
KEY `pid`
(`pid`)
|
28
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8
AUTO_INCREMENT=5 ;
|
29
|
-- 表的結構 `think_role_user`此表為使用者和組對應關係表
|
30
|
CREATE TABLE IF NOT EXISTS
`think_role_user` (
|
31
|
`role_id`
mediumint(9) unsigned DEFAULT NULL,
|
32
|
`user_id`
char(32) DEFAULT NULL,
|
33
|
KEY
`group_id` (`role_id`),
|
34
|
KEY
`user_id` (`user_id`)
|
35
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
36
|
-- 表的結構 `think_user`此表為使用者表
|
37
|
CREATE TABLE IF NOT EXISTS
`think_user` (
|
38
|
`id`
int(11) NOT NULL AUTO_INCREMENT,
|
39
|
`username`
varchar(100) NOT NULL,
|
40
|
`password`
char(32) NOT NULL,
|
41
|
PRIMARY
KEY (`id`)
|
42
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8
AUTO_INCREMENT=4 ;
|
以下五個表,我現在寫好演示用的SQL執行語句幫助大家建表,大家在實驗建表的過程中只需要複製使用下面的SQL語句即可:
看著是不是又暈了?呵呵,沒關係,我們來用一個簡單的圖表和簡易圖來像大家說明:
表Think_access:
Role_ID Node_id pid level
使用者組的編號 節點表 節點表中的父ID項 節點表中的等級項
注:如果使用者組id和對應的節點id存在這張表中,就表示使用者所在的使用者組有許可權進行對應的操作許可權。
表Think_node
id name title pid level
節點編號,用來產生關聯關係,主鍵,自增方便索引 專案,模組或者動作的名字(嚴格區分大小寫) 專案或模組的備註,方便管理員認識和了解 注① 只能為1,2,3分別代表專案,模組,操作動作
注① :
1)如果是專案名稱則專案是頂級的,它上面沒有父路徑編號(pid),因此pid則為0;例如,網站下有一個Admin專案,它是頂級的。因此沒有父路徑編號(pid),此處應填0,如果它為第一次插入資料庫的,它的id則為1。全欄位插入資料庫應為:
id name title pid level
1 Admin Admin專案節點 0 1
2)如果某專案下有一個模組。則父路徑編號(pid)則為該某塊所在的專案編號(id)。例如,Admin下面有一個模組為User,它是第二個插入資料庫的。因此,模組的父路徑(pid)應填1。全欄位插入資料庫應為:
id name title pid level
2 User User模組節點 0 2
3)如果在某模組下面有三個動作(或成員方法),分別Index(顯示)、insert(插入)、delete(刪除),它們三個的父路徑為該模組的編號。例如User模組下有Index、insert、delete三個動作或成員方法,它們分別是第三,四,五次插入資料庫的。他們的父路徑編號(pid)應填2。全欄位插入資料庫應為:
id name title pid level
3 User User模組下顯示動作 0 2
4 Index User模組下插入動作 0 2
5 insert User模組下刪除動作 0 2
表think_role
id name
組的編號(主鍵) 組的名字
注:此表中可以插入父路徑編號(pid)產生組的包含關係。對應的父路徑編號(pid)為所屬組的編號(id)。
表think_user
id username password
使用者編號(主鍵,int型別) 使用者名稱(varchar型別) 密碼(char型別32位)
注:id在下一張表中結合think_role產生使用者與組的關聯關係。建議username設為唯一的,password採用32位md5加密。
表think_role_user
group_id User_id
組編號(主鍵,int型別) 使用者編號(主鍵,int型別)
注:使用者編號(user_id)對應哪一個group_id,則哪個使用者就屬於哪一個組。可以讓同一個使用者對應多個組。就意味著,一個使用者具有多個組的屬性和操作許可權。
最難理解,也是最核心的資料庫結構和儲存結構說完了,對照著這個資料庫進行插入,新增修改即可。