1. 程式人生 > >TP框架中,關於對auth許可權分配的理解

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;
 */


3,三張資料表建好之後,根據個人理解我來說一下三張資料表的結構和作用。

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 ) );