tp3.2.3許可權控制一之詳解及demo
一、首先需明確TP3.2.3的許可權控制是怎麼實現的
RBAC(Role-Based Access Control,基於角色的訪問控制),就是使用者通過角色與許可權進行關聯。簡單地說,一個使用者擁有多個角色,每一個角色擁有多個許可權。這樣,就構造成“使用者-角色-許可權”的授權模型。在這種模型中,使用者與角色之間,角色與許可權之間,一般者是多對多的關係。
這部分大家可以百度一下TP的RBAC,會有很多專業的說明,我這邊就不一一陳述了。
二、基本步驟
1、使用者登入,此時獲取使用者的id,以及所屬的許可權組 2、查詢使用者此時許可權組對應的控制器以及方法。並且把查詢結果拿出來。 3、使用者登入之後,我們根據使用者對應的許可權組中的方法,只顯示使用者擁有許可權的列表部分。無許可權的模組不顯示。 4、在使用者每訪問一個方法的時候,我們就判斷此時,使用者對應的許可權組有沒有該方法,沒有的話就提示使用者無許可權。(需要用公用控制器,類似於Base這種) 5、由以上可知。做許可權控制,也需要做許可權管理,使用者管理等模組。
三、準備工作
1、首先是找到TP給出的許可權方法
在ThinkPHP/Library/Think/Auth.class.php,開啟即可
這個地方是需要我們自己配置的。首先是開啟許可權控制。其次是選擇實時驗證的方式,使用者每點選一個方法,我們都驗證一下。然後根據註釋再配置對應的表。
2、資料庫新建四個表
1)如圖
2)admin也就是我們的使用者表,即管理員表
3)使用者組表
這裡對應的就是後臺的人員分類。具體的參考自己的邏輯來進行分類。status=1代表是可用的狀態。 rules裡面的數字代表這個使用者組對應的許可權id,也就是控制器方法的id
4)使用者組合使用者的對映表
這裡主要是使用者和對應使用者組之間的關係。當我們新增管理員的時候,需要選擇該管理員對應的使用者組,相當於給他分配一個許可權範圍
5)許可權規則表
這個表就需要我們把每個控制,以及控制器上面對應的方法寫出來。name欄位對應的格式就是“控制器-方法名稱”。
title代表方法名稱。
status代表該方法是否可用
direct_jump代表該方法是否可跳轉
sort代表該方法對應的優先度。排序時候用的。
condition,這個欄位不為0就代表該方法可驗證
四、具體程式碼
1、使用者登入,登入之後記得儲存一個使用者id
session('adminId', $arr['id']);
2、BaseController是每個控制器都要繼承的一個方法,目的是判斷使用者是否登入,沒登入的就跳到登入頁,登陸成功的就開始進行許可權驗證
class BaseController extends Controller{
public function _initialize()
{
session_start();
$adminId = session('adminId'); // 管理員使用者id
if(!isset($adminId))
{
$this->success("您還沒有登入",__APP__.'/Login/login');
exit;
}else{
R('Public/auth', array($adminId));
}
}
}
這裡使用了tp自帶的R方法來訪問我們的許可權控制部分的程式碼。R方法可以直接訪問控制器中的具體方法,並且可以帶引數。
3、登入之後,訪問我們的public控制器下的auth方法。把使用者id傳過去
下面是auth部分的程式碼
public function auth($adminId) {
$auth = new \Think\Auth();
// 普通使用者得到許可權列表
$getAuthList = $auth->getAuthList($adminId, 1);
if ( empty($getAuthList) ) {
session(null);
$this->error('你的賬號沒任何操作許可權!', U('Login/login'));
}
session('authList', $getAuthList);
if ( !$auth->check(CONTROLLER_NAME.'-'.ACTION_NAME , $adminId) ) {
// 無訪問許可權的時候才跳轉
$white = in_array(CONTROLLER_NAME.'-'.ACTION_NAME, array(
'Login-login','Index-index'
));
$preJumpUrl = session('preJumpUrl');
// if(session('adminId')==1) return true;
if ( $white || empty($preJumpUrl) ) {
// 找出可直接跳轉的許可權地址
$canJumpList = M('smj_auth_rule')->where(array('direct_jump'=>'1'))->order('sort DESC')->getField('name', true);
foreach ($getAuthList as $value) {
foreach ( $canJumpList as $jumpValue ) {
if ( strtolower($value) == strtolower($jumpValue) ) {
$url = str_replace('-', '/', $jumpValue);
session('preJumpUrl', $url);
header('LOCATION:' . U($url));
exit();
}
}
}
} else {
header("Content-type:text/html;charset=utf-8");
exit('你沒有足夠的許可權訪問該地址!<a href="' . U($preJumpUrl) . '">跳轉到可訪問頁面</a>');
}
}
}
這部分的主要意思就是:
1)獲取傳過來的使用者id
2)根據TP自帶的Auth.class.php中的方法,獲取使用者對應的許可權資訊
3)判斷是可用方法之後,讀取規則表中的控制器方法,並且替換成標準的,可跳轉的”控制器/方法”形式。
4)進行跳轉
5)一些表名需要替換成你自己的表名。使用者無許可權部分的程式碼可以自己美化一下,我這邊是很簡單的。
以上就是TP3.2.3的許可權控制部分程式碼。以上程式碼可以實現簡單的許可權控制,但是要知道,許可權控制是環環相扣的,我們需要做的還有給使用者新增許可權,修改許可權等。具體的請看下篇。
end