使用yii怎么實(shí)現(xiàn)一個(gè)權(quán)限分級(jí)式訪問(wèn)控制功能?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

yii framework 提供了2套權(quán)限訪問(wèn)系統(tǒng),一套是簡(jiǎn)單的filter(過(guò)濾器)模式,另一套是復(fù)雜全面的RBAC模式,我這里要講的是第一套(因?yàn)槲乙矂倓倢W(xué)到這里)。如 果你有研究過(guò)YII官方的demo blog,一定知道,比如,由gii自動(dòng)生成的user模塊,自動(dòng)附帶了簡(jiǎn)單的filter權(quán)限分配功能,具體細(xì)節(jié)請(qǐng)參照blog手冊(cè)的“用戶驗(yàn)證”一章 節(jié),以及yii官方指南的“驗(yàn)證和授權(quán)”一章節(jié)。(注意,我這里所指的模塊,只是我個(gè)人對(duì)與user有關(guān)的文件的統(tǒng)稱(chēng),與yii文件系統(tǒng)的模塊 (module)含義不同。)
關(guān)于權(quán)限分配的文件大多在controllers里,比如打開(kāi)UserController.php文件你會(huì)看到2個(gè)類(lèi)函數(shù)。
復(fù)制代碼 代碼如下:
public function filters()
{
return array(
'accessControl', // 實(shí)現(xiàn)CRUD操作的訪問(wèn)控制。
'postOnly + delete',
);
}
public function accessRules() //這里就是訪問(wèn)規(guī)則的設(shè)置。
{
return array(
array('allow', // 允許所有用戶執(zhí)行index,view動(dòng)作。
'actions'=>array('index','view'),
'users'=>array('*'), <span></span>
),
array('allow', // 只允許經(jīng)過(guò)驗(yàn)證的用戶執(zhí)行create, update動(dòng)作。
'actions'=>array('create','update'),
'users'=>array('@'), // @號(hào)指所有注冊(cè)的用戶
),
array('allow', // 只允許用戶名是admin的用戶執(zhí)行admin,delete動(dòng)作
'actions'=>array('admin','delete'),
'users'=>array('admin'),
), //admin就是指用戶名是admin的用戶,以硬編碼的形式分配用戶權(quán)限。
array('deny', // 拒絕所有的訪問(wèn)。
'users'=>array('*'),
),
);
}
關(guān)于更多的訪問(wèn)規(guī)則的設(shè)定請(qǐng)參照官方文件/tupian/20230522/CAccessControlFilter
好了,現(xiàn)在要開(kāi)始按照我們自己的需求設(shè)置適合自己的權(quán)限分配了。我們希望filter訪問(wèn)控制模式能更完美一點(diǎn),按照常識(shí),我們希望它能按照數(shù)據(jù)庫(kù)里user表里不同級(jí)別用戶,實(shí)行不同的授權(quán),而不是用硬編碼的形式控制。
回到demo blog,我先對(duì)數(shù)據(jù)庫(kù)的tbl_user表做修改,在原來(lái)的基礎(chǔ)上加上role一項(xiàng)。對(duì)原來(lái)的用戶信息記錄添加role的value為"管理員"或"一般用戶"。
然后依次執(zhí)行以下3個(gè)步驟:
1. 創(chuàng)建組件WebUser,它是對(duì)CWebUser的擴(kuò)展。
2. 修改config/main.php文件。
3.修改accessRules()。
具體細(xì)節(jié)如下:
1.WebUser.php 組件代碼:
復(fù)制代碼 代碼如下:
<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找到如下代碼,添加標(biāo)紅色的代碼。
復(fù)制代碼 代碼如下:
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
'class'=>'WebUser',
),
3.找到需要更改權(quán)限的controller類(lèi),對(duì)accessRules()函數(shù)做修改,比如對(duì)前文的accessRules()函數(shù)做如下修改:
復(fù)制代碼 代碼如下:
public function accessRules() //這里就是訪問(wèn)規(guī)則的設(shè)置。 {
return array(
array('allow', // 允許所有用戶執(zhí)行index,view動(dòng)作。
'actions'=>array('index','view'),
'users'=>array('*'), //*號(hào)標(biāo)識(shí)所有用戶包括注冊(cè)的、沒(méi)注冊(cè)的、一般的、管理員級(jí)的
),
array('allow', // 只允許經(jīng)過(guò)驗(yàn)證的用戶執(zhí)行create, update動(dòng)作。
'actions'=>array('create','update'),
'users'=>array('@'), // @號(hào)指所有注冊(cè)的用戶
),
array('allow', // 只允許用戶名是admin的用戶執(zhí)行admin,delete動(dòng)作
'actions'=>array('admin','delete'),
'expression'=>'yii::app()->user->isAdmin()',
//這樣只有標(biāo)識(shí)為“管理員”的用戶才能訪問(wèn)admin,delete動(dòng)作
),
array('deny', // 拒絕所有的訪問(wèn)。
'users'=>array('*'),
),
);
看完上述內(nèi)容,你們掌握使用yii怎么實(shí)現(xiàn)一個(gè)權(quán)限分級(jí)式訪問(wèn)控制功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前文章:使用yii怎么實(shí)現(xiàn)一個(gè)權(quán)限分級(jí)式訪問(wèn)控制功能-創(chuàng)新互聯(lián)
分享URL:http://chinadenli.net/article22/hhdjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、外貿(mào)建站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、面包屑導(dǎo)航、品牌網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容