yii 權限分級式訪問控制的實現(非RBAC法)

主要參考資料來源:yii官網http://www.yiiframework.com/wiki/60/  我只是作了小小的完善。

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('*'),            
          ),                    
        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文件。 php

3.修改accessRules()。 數據庫

具體細節以下: express

1.WebUser.php 組件代碼: api

<?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; } } ?>


2.在config/main.php找到以下代碼,添加標紅色的代碼。 cookie

    'components'=>array(
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
             'class'=>'WebUser',
        ),
app

3.找到須要更改權限的controller類,對accessRules()函數作修改,好比對前文的accessRules()函數作以下修改: yii


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('*'),
            ),
        );

   


工做完成! 函數

相關文章
相關標籤/搜索