深入解析yii許可權分級式訪問控制的實現(非RBAC法)

NO IMAGE

yii framework 提供了2套許可權訪問系統,一套是簡單的filter(過濾器)模式,另一套是複雜全面的RBAC模式,我這裡要講的是第一套(因為我也剛剛學到這裡)。如 果你有研究過YII官方的demo blog,一定知道,比如,由gii自動生成的user模組,自動附帶了簡單的filter許可權分配功能,具體細節請參照blog手冊的“使用者驗證”一章 節,以及yii官方指南的“驗證和授權”一章節。(注意,我這裡所指的模組,只是我個人對與user有關的檔案的統稱,與yii檔案系統的模組 (module)含義不同。)
關於許可權分配的檔案大多在controllers裡,比如開啟UserController.php檔案你會看到2個類函式。
複製程式碼 程式碼如下:
public function filters()
     {
      return array(
       ‘accessControl’,               // 實現CRUD操作的訪問控制。
       ‘postOnly delete’,
         );
     }

 public function accessRules()              //這裡就是訪問規則的設定。
     {
      return array(
         array(‘allow’,              // 允許所有使用者執行index,view動作。
           ‘actions’=>array(‘index’,’view’),
           ‘users’=>array(‘*’), <span></span>          
           ),                   
         array(‘allow’,             // 只允許經過驗證的使用者執行create, update動作。
            ‘actions’=>array(‘create’,’update’),
            ‘users’=>array(‘@’),       // @號指所有註冊的使用者
             ),
         array(‘allow’,             // 只允許使用者名稱是admin的使用者執行admin,delete動作
             ‘actions’=>array(‘admin’,’delete’),
             ‘users’=>array(‘admin’),
             ),                   //admin就是指使用者名稱是admin的使用者,以硬編碼的形式分配使用者許可權。
             array(‘deny’,           // 拒絕所有的訪問。
             ‘users’=>array(‘*’),
             ),
         );
     }

關於更多的訪問規則的設定請參照官方檔案http://www.yiiframework.com/doc/api/1.1/CAccessControlFilter
好了,現在要開始按照我們自己的需求設定適合自己的許可權分配了。我們希望filter訪問控制模式能更完美一點,按照常識,我們希望它能按照資料庫裡user表裡不同級別使用者,實行不同的授權,而不是用硬編碼的形式控制。

回到demo blog,我先對資料庫的tbl_user表做修改,在原來的基礎上加上role一項。對原來的使用者資訊記錄新增role的value為”管理員”或”一般使用者”。
然後依次執行以下3個步驟:
1. 建立元件WebUser,它是對CWebUser的擴充套件。
2. 修改config/main.php檔案。
3.修改accessRules()。
具體細節如下:
1.WebUser.php 元件程式碼:
複製程式碼 程式碼如下:
<strong><?php

 // this file must be stored in:
 // protected/components/WebUser.php

 class WebUser extends CWebUser {

   // Store model to not repeat query.
   private $_model;

   // Return first name.
   // access it by Yii::app()->user->first_name
   function getFirst_Name(){
     $user = $this->loadUser(Yii::app()->user->id);
     return $user->first_name;
   }

   // This is a function that checks the field ‘role’
   // in the User model to be equal to 1, that means it’s admin
   // access it by Yii::app()->user->isAdmin()
   function isAdmin(){
     $user = $this->loadUser(Yii::app()->user->id);
     if ($user==null)
         return 0;
     else
         return $user->role == “管理員”;
   }

   // Load user model.
   protected function loadUser($id=null)
     {
         if($this->_model===null)
         {
             if($id!==null)
                 $this->_model=User::model()->findByPk($id);
         }
         return $this->_model;
     }
 }
 ?></strong>

2.在config/main.php找到如下程式碼,新增標紅色的程式碼。
複製程式碼 程式碼如下:
   ‘components’=>array(
        ‘user’=>array(
            // enable cookie-based authentication
            ‘allowAutoLogin’=>true,
             ‘class’=>’WebUser’,
        ),

3.找到需要更改許可權的controller類,對accessRules()函式做修改,比如對前文的accessRules()函式做如下修改:
複製程式碼 程式碼如下:
public function accessRules()  //這裡就是訪問規則的設定。     {
     return array(
         array(‘allow’,                     // 允許所有使用者執行index,view動作。
             ‘actions’=>array(‘index’,’view’),
             ‘users’=>array(‘*’),         //*號標識所有使用者包括註冊的、沒註冊的、一般的、管理員級的
         ),
         array(‘allow’,                      // 只允許經過驗證的使用者執行create, update動作。
             ‘actions’=>array(‘create’,’update’),
             ‘users’=>array(‘@’),       // @號指所有註冊的使用者
         ),
         array(‘allow’,                     // 只允許使用者名稱是admin的使用者執行admin,delete動作
             ‘actions’=>array(‘admin’,’delete’),
             ‘expression’=>’yii::app()->user->isAdmin()’,
             //這樣只有標識為“管理員”的使用者才能訪問admin,delete動作
         ),
         array(‘deny’,  // 拒絕所有的訪問。
             ‘users’=>array(‘*’),
         ),
     );

工作完成!

您可能感興趣的文章:

Javascript中的幾種繼承方式對比分析淺析2種JavaScript繼承方式Javascript程式設計中幾種繼承方式比較分析JavaScript中的繼承方式詳解javascript學習筆記(九)javascript中的原型(prototype)及原型鏈的繼承方式JavaScript繼承方式例項Linux下SVN伺服器同時支援Apache的http和svnserve獨立伺服器兩種模式且使用相同的訪問許可權賬號Oracle 低許可權資料庫賬戶得到 OS 訪問許可權 提權利用Oracle 10g各個帳號的訪問許可權、登入路徑、監控狀態命令查詢等等127.0.0.1無法訪問,沒有許可權: GetObject使用Cacls命令設定伺服器檔案訪問許可權C 的三種訪問許可權與三種繼承方式