1. 程式人生 > >ThinkPHP中RBAC資料庫詳解

ThinkPHP中RBAC資料庫詳解

    許多人提到有關ThinkPHP都會對它的高效,方便為之折服。但與很多朋友交流後,都對它當中的RBAC許可權控制,感到頭疼不已。看完這個文件,相信大家一定會有很清晰的瞭解。並且,以後關於這個框架的許可權控制非常熟析,並且能熟練掌握。
    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,則哪個使用者就屬於哪一個組。可以讓同一個使用者對應多個組。就意味著,一個使用者具有多個組的屬性和操作許可權。
    最難理解,也是最核心的資料庫結構和儲存結構說完了,對照著這個資料庫進行插入,新增修改即可。