程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Yii 權限分級式訪問控制實現(非RBAC法)

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

編輯:關於PHP編程

以下由我們在信易網絡公司開發項目的時候終結出的一些經驗

主要參考資料: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文件。

3.修改accessRules()。

具體細節如下:

1.WebUser.php 組件代碼:

<?php
 
class WebUser extends CWebUser {
  private $_model;
 
  function getFirst_Name(){
    $user = $this->loadUser(Yii::app()->user->id);
    return $user->first_name;
  }
  function isAdmin(){
    $user = $this->loadUser(Yii::app()->user->id);
    if ($user==null)
        return 0;
    else
        return $user->role == "管理員";
  }
  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找到如下代碼,添加標紅色的代碼。

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

本文由專注於成都網站建設的信易網絡發布,更多關於yii的信息請關注信易網絡隨後的發布,信易網絡的官網http://www.ir58.com 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved