ThinkPHP中RBAC類詳解(一)

    通過一天的努力,終於把ThinkPHP的RBAC類弄明白了,如今記錄下來,成果與你們分享。要想獲得更詳盡的信息,還須要去查看RBAC類的源代碼。node

    首先須要使用5張數據表,關係圖以下:sql

    這五張表的英文名是任意的,只需修改相應的配置項就能夠,默認的英文名分別爲:用戶表(think_user)、用戶組表(think_role)、節點表(think_node)、用戶與用戶組關係表(think_role_user)、權限表(think_access)。數據庫

    生成他們的sql語句以下(複製粘貼的):app

   

CREATE TABLE IF NOT EXISTS `think_access` (   `role_id` smallint(6) unsigned NOT NULL,   `node_id` smallint(6) unsigned NOT NULL,   `level` tinyint(1) NOT NULL,   `module` varchar(50) DEFAULT NULL,   KEY `groupId` (`role_id`),   KEY `nodeId` (`node_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `think_node` (   `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,   `name` varchar(20) NOT NULL,   `title` varchar(50) DEFAULT NULL,   `status` tinyint(1) DEFAULT '0',   `remark` varchar(255) DEFAULT NULL,   `sort` smallint(6) unsigned DEFAULT NULL,   `pid` smallint(6) unsigned NOT NULL,   `level` tinyint(1) unsigned NOT NULL,   PRIMARY KEY (`id`),   KEY `level` (`level`),   KEY `pid` (`pid`),   KEY `status` (`status`),   KEY `name` (`name`) ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `think_role` (   `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,   `name` varchar(20) NOT NULL,   `pid` smallint(6) DEFAULT NULL,   `status` tinyint(1) unsigned DEFAULT NULL,   `remark` varchar(255) DEFAULT NULL,   PRIMARY KEY (`id`),   KEY `pid` (`pid`),   KEY `status` (`status`) ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;CREATE TABLE IF NOT EXISTS `think_role_user` (   `role_id` mediumint(9) unsigned DEFAULT NULL,   `user_id` char(32) DEFAULT NULL,   KEY `group_id` (`role_id`),   KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    注意其中沒有think_user表的生成語句,這張表在你編寫「用戶模型(User Model)」時自行建立,由於RBAC類不作相似於登陸時用戶名、密碼是否匹配的工做。換句話說,檢查用戶名、密碼是否匹配,該用戶能不能成功登陸的代碼是你寫的,你須要在用戶成功登陸後,將這個用戶的ID寫到相應的SESSION裏,普通用戶的寫到$_SESSION[C('USER_AUTH_KEY')]裏,管理員的寫到$_SESSION[C('ADMIN_AUTH_KEY')]裏。code

    接下來要說明的是幾個相關的配置項: ci

// ADMIN_AUTH_KEY 管理員認證SESSION標記
// USER_AUTH_KEY 用戶認證SESSION標記
// 
// $_SESSION[C('USER_AUTH_KEY')] 用來保存登錄成功後的用戶ID
// $_SESSION[C('ADMIN_AUTH_KEY')] 用來保存登錄成功後的管理員ID
// 
// USER_AUTH_ON 是否須要認證
// USER_AUTH_TYPE 認證類型,1是登錄認證,2是實時認證
// USER_AUTH_MODEL 用戶模型名稱
// GUEST_AUTH_ON 是否開啓遊客受權訪問
// GUEST_AUTH_ID 遊客的用戶ID
// 
// REQUIRE_AUTH_MODULE  須要認證模塊(若定義了,則只驗證給出的模塊;不然驗證全部模塊)
// NOT_AUTH_MODULE 無需認證模塊(若定義了「須要認證模塊」則本條定義無效)
// REQUIRE_AUTH_ACTION 須要認證操做(若定義了,則只驗證給出的操做;不然驗證全部操做)
// NOT_AUTH_ACTION 無需認證操做(若定義了「須要認證操做」則本條定義無效)
// 
// USER_AUTH_GATEWAY 認證網關,若是用戶沒有登陸則轉到這頁(URL路由規則)
// RBAC_DB_DSN  數據庫鏈接DSN
// RBAC_ROLE_TABLE 角色表名稱
// RBAC_USER_TABLE 用戶表名稱(應該是用戶、用戶組關係表)
// RBAC_ACCESS_TABLE 權限表名稱
// RBAC_NODE_TABLE 節點表名稱

    在定義了這幾項以後,就能夠調用RBAC類中的方法了,這些方法的聲明及解釋以下:路由

1.rem

static public function authenticate($map,$model='')

根據map中指定的條件查詢「用戶模型」,返回符合條件的數據。其實就是M(User)->where($map)->find()。get

2.it

static function saveAccessList($authId=null)

檢測當前用戶的全部權限,並將這些擁有的權限保存在$_SESSION['_ACCESS_LIST']中,不返回任何東西。開銷很大,是對RBAC::getAccessList的默認參數封裝。

3.

static function getRecordAccessList($authId=null,$module='')

檢測當前用戶在當前模塊中所擁有的權限,並將這些權限返回。開銷很大,是對getModuleAccessList的默認參數封裝。

4.

static function checkAccess()

檢查當前操做是否須要認證,須要認證則返回true,不須要則返回false.

5.

static public function checkLogin()

檢查用戶是否登陸。若是沒有登陸,則嘗試進行「遊客」登陸;若是沒有開啓以遊客身份登陸,則跳轉到認證網關。登陸成功將返回true。

6.

static public function AccessDecision($appName=APP_NAME)

權限認證的過濾器方法,檢查當前操做是否被容許,返回bool值。

7.

static public function getAccessList($authId)

取得指定用戶的權限列表。

8.

static public function getModuleAccessList($authId,$module)

取得指定用戶、指定模塊的權限列表。

相關文章
相關標籤/搜索