国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

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

2024-05-04 23:10:23
字體:
來源:轉載
供稿:網友
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('*'),
),
);
}


關于更多的訪問規則的設定請參照官方文件
好了,現在要開始按照我們自己的需求設置適合自己的權限分配了。我們希望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('*'),
),
);


工作完成!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马山县| 都江堰市| 土默特左旗| 乐平市| 疏附县| 调兵山市| 寻甸| 扎鲁特旗| 临汾市| 彰武县| 调兵山市| 大同县| 丰都县| 明水县| 白河县| 勐海县| 阳原县| 青海省| 惠来县| 广饶县| 如皋市| 鹤山市| 陇南市| 苗栗县| 凤台县| 鄂州市| 新郑市| 德州市| 扶沟县| 梓潼县| 九龙城区| 仲巴县| 梨树县| 吴江市| 珠海市| 繁峙县| 岫岩| 芜湖县| 新余市| 宁化县| 太保市|