1. 程式人生 > >tp3.2.3許可權控制一之詳解及demo

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