TP框架中,關於對auth許可權分配的理解
最近正在和總工做一個專案,學著練著,練著不會了就抓緊學。本身基礎不好,那就使勁兒啃唄。
今天的主題,一個綜合性網站後臺中,免不了要有管理員和普通員工。而管理員可以訪問的後臺頁面相對於普通會員是不一樣的,管理員的許可權比較高,可以任意的增刪改查,而普通員工只能訪問固定的頁面和新建文章。而這些問題可以通過ThinkPHP系統內自帶的auth類來指定規則和驗證此使用者是否有符合規則。
auth翻譯成中文也就是認證的意思。
首先ThinkPHP版本:ThinkPHP3.2.3完整版。auth類在核心板是沒有的,完整版才有。
1,開啟Thinkphp/library/think/auth.class.php檔案,類中第一句就說明了預設配置的問題,首先需要四張表,auth_group:使用者組資料表、auth_group_access:使用者和使用者組的關係表、auth_rule:許可權規則表、user:你自己的使用者表。
這些表定義好之後,將這些複製到應用級別的config.php檔案中,類似於資料庫類的複製。
2.之後我們開始建立我們的資料表:可以使用下列程式碼、
//資料庫
/*
-- ----------------------------
-- think_auth_rule,規則表,
-- id:主鍵,name:規則唯一標識, title:規則中文名稱 status 狀態:為1正常,為0禁用,condition:規則表示式,為空表示存在就驗證,不為空表示按照條件驗證
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_rule`;
CREATE TABLE `think_auth_rule` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(80) NOT NULL DEFAULT '',
`title` char(20) NOT NULL DEFAULT '',
`type` tinyint(1) NOT NULL DEFAULT '1',
`status` tinyint(1) NOT NULL DEFAULT '1',
`condition` char(100) NOT NULL DEFAULT '', # 規則附件條件,滿足附加條件的規則,才認為是有效的規則
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group 使用者組表,
-- id:主鍵, title:使用者組中文名稱, rules:使用者組擁有的規則id, 多個規則","隔開,status 狀態:為1正常,為0禁用
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group`;
CREATE TABLE `think_auth_group` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`title` char(100) NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT '1',
`rules` char(80) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group_access 使用者組明細表
-- uid:使用者id,group_id:使用者組id
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group_access`;
CREATE TABLE `think_auth_group_access` (
`uid` mediumint(8) unsigned NOT NULL,
`group_id` mediumint(8) unsigned NOT NULL,
UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
KEY `uid` (`uid`),
KEY `group_id` (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/
auth_rule表:
id:表的主鍵,自增,標識。
name:認證規則(格式: 模組名\控制器名\方法名)
title:對認證規則的描述
type:tinyint型別,如果type=1,則condition欄位就可以定義規則表示式。
condition:當type=1時,condition欄位裡邊的內容將會用正則表示式的規則來配合規則認證使用者。
auth_group表:
id:認證組別的標識,主鍵自增。
title:組別名稱。
status:預設1為開啟,0為關閉。
rules:規則的id(也就是auth_rule表中的id)。
auth_group_access表:
uid:會員ID(這裡的id其實就是你自己user表中的id,你想規定哪個id需要哪一項許可權,就填進去就可以)。
group_id:認證組別的id(auth_group中分組的id)。
三張表的結構已經講清楚了,可能看了之後還不太明白。
其實auth類的驗證流程是這樣的:首先獲取登入時使用者的session['id'] -> 判斷使用者處於什麼分組 -> 判斷此分組規則 -> 通過規則驗證成功,不通過返回。
具體點就是,假如說session['id'] = 1 ,auth會將此id拿到auth_group_access表中對照這個id屬於什麼分組。假如說id=1屬於1分組,系統會再拿著分組1到auth_group表中核對分組1屬於哪一項規則id,然後再拿著這一項規則id去auth_rule表中查詢規則,查詢到規則之後,再與check()方法中的規則相比對,相同返回true,不同返回false。還有status和type沒有說,其實就是status=0的話,則這條規則不存在。type=1時,如果condition中有正則表示式,系統會再此驗證是否符合正則。
通過例項來說吧:
1,我們要將auth.class.php中的配置語句複製到分組級別的配置檔案當中:
'AUTH_CONFIG'=>array(
'AUTH_ON' => true, //認證開關
'AUTH_TYPE' => 1, // 認證方式,1為時時認證;2為登入認證。
'AUTH_GROUP' => 'think_auth_group', //使用者組資料表名
'AUTH_GROUP_ACCESS' => 'think_auth_group_access', //使用者組明細表
'AUTH_RULE' => 'think_auth_rule', //許可權規則表
'AUTH_USER' => 'sp_user'//使用者資訊表
) ,
2,然後在分組控制器中新增
public function _initialize() {
$id = (int)session('id');
if(empty($id)) {
$url = U('Public/login');
echo "<script>top.location.href='$url'</script>";
}
$auth = new \Think\Auth();
var_dump( $auth->check( 'Admin/Dept/showList', $id ) );
var_dump( $auth->check( 'Admin/admin/home', $id ) );
var_dump( $auth->check( 'Admin/Dept/edit', $id ) );
if( $auth->check( 'Admin/Dept/add', $id ) == true){
echo "i love likui";
}else{
echo "oh my god!";
};
}
var_dump返回true or false。同樣可以用if迴圈判斷。
可以同時對多條規則進行認證,並設定多條規則的關係(or或者and)
$auth=new Auth(); $auth->check('規則1,規則2','使用者id','and');
在驗證的時候可以用 MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 來自動獲取當前的 模組名稱/控制器名稱/方法名稱例如: $auth->check( MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME, 1 ) );