深入解析yii權(quán)限分級式訪問控制的實現(xiàn)(非RBAC法)
更新時間:2013年06月13日 15:06:01 作者:
本篇文章是對yii權(quán)限分級式訪問控制的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
yii framework 提供了2套權(quán)限訪問系統(tǒng),一套是簡單的filter(過濾器)模式,另一套是復雜全面的RBAC模式,我這里要講的是第一套(因為我也剛剛學到這里)。如 果你有研究過YII官方的demo blog,一定知道,比如,由gii自動生成的user模塊,自動附帶了簡單的filter權(quán)限分配功能,具體細節(jié)請參照blog手冊的“用戶驗證”一章 節(jié),以及yii官方指南的“驗證和授權(quán)”一章節(jié)。(注意,我這里所指的模塊,只是我個人對與user有關(guān)的文件的統(tǒng)稱,與yii文件系統(tǒng)的模塊 (module)含義不同。)
關(guān)于權(quán)限分配的文件大多在controllers里,比如打開UserController.php文件你會看到2個類函數(shù)。
public function filters()
{
return array(
'accessControl', // 實現(xiàn)CRUD操作的訪問控制。
'postOnly + delete',
);
}
public function accessRules() //這里就是訪問規(guī)則的設(shè)置。
{
return array(
array('allow', // 允許所有用戶執(zhí)行index,view動作。
'actions'=>array('index','view'),
'users'=>array('*'), <span></span>
),
array('allow', // 只允許經(jīng)過驗證的用戶執(zhí)行create, update動作。
'actions'=>array('create','update'),
'users'=>array('@'), // @號指所有注冊的用戶
),
array('allow', // 只允許用戶名是admin的用戶執(zhí)行admin,delete動作
'actions'=>array('admin','delete'),
'users'=>array('admin'),
), //admin就是指用戶名是admin的用戶,以硬編碼的形式分配用戶權(quán)限。
array('deny', // 拒絕所有的訪問。
'users'=>array('*'),
),
);
}
關(guān)于更多的訪問規(guī)則的設(shè)定請參照官方文件http://www.yiiframework.com/doc/api/1.1/CAccessControlFilter
好了,現(xiàn)在要開始按照我們自己的需求設(shè)置適合自己的權(quán)限分配了。我們希望filter訪問控制模式能更完美一點,按照常識,我們希望它能按照數(shù)據(jù)庫里user表里不同級別用戶,實行不同的授權(quán),而不是用硬編碼的形式控制。
回到demo blog,我先對數(shù)據(jù)庫的tbl_user表做修改,在原來的基礎(chǔ)上加上role一項。對原來的用戶信息記錄添加role的value為"管理員"或"一般用戶"。
然后依次執(zhí)行以下3個步驟:
1. 創(chuàng)建組件WebUser,它是對CWebUser的擴展。
2. 修改config/main.php文件。
3.修改accessRules()。
具體細節(jié)如下:
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.找到需要更改權(quán)限的controller類,對accessRules()函數(shù)做修改,比如對前文的accessRules()函數(shù)做如下修改:
public function accessRules() //這里就是訪問規(guī)則的設(shè)置。 {
return array(
array('allow', // 允許所有用戶執(zhí)行index,view動作。
'actions'=>array('index','view'),
'users'=>array('*'), //*號標識所有用戶包括注冊的、沒注冊的、一般的、管理員級的
),
array('allow', // 只允許經(jīng)過驗證的用戶執(zhí)行create, update動作。
'actions'=>array('create','update'),
'users'=>array('@'), // @號指所有注冊的用戶
),
array('allow', // 只允許用戶名是admin的用戶執(zhí)行admin,delete動作
'actions'=>array('admin','delete'),
'expression'=>'yii::app()->user->isAdmin()',
//這樣只有標識為“管理員”的用戶才能訪問admin,delete動作
),
array('deny', // 拒絕所有的訪問。
'users'=>array('*'),
),
);
工作完成!
關(guān)于權(quán)限分配的文件大多在controllers里,比如打開UserController.php文件你會看到2個類函數(shù)。
復制代碼 代碼如下:
public function filters()
{
return array(
'accessControl', // 實現(xiàn)CRUD操作的訪問控制。
'postOnly + delete',
);
}
public function accessRules() //這里就是訪問規(guī)則的設(shè)置。
{
return array(
array('allow', // 允許所有用戶執(zhí)行index,view動作。
'actions'=>array('index','view'),
'users'=>array('*'), <span></span>
),
array('allow', // 只允許經(jīng)過驗證的用戶執(zhí)行create, update動作。
'actions'=>array('create','update'),
'users'=>array('@'), // @號指所有注冊的用戶
),
array('allow', // 只允許用戶名是admin的用戶執(zhí)行admin,delete動作
'actions'=>array('admin','delete'),
'users'=>array('admin'),
), //admin就是指用戶名是admin的用戶,以硬編碼的形式分配用戶權(quán)限。
array('deny', // 拒絕所有的訪問。
'users'=>array('*'),
),
);
}
關(guān)于更多的訪問規(guī)則的設(shè)定請參照官方文件http://www.yiiframework.com/doc/api/1.1/CAccessControlFilter
好了,現(xiàn)在要開始按照我們自己的需求設(shè)置適合自己的權(quán)限分配了。我們希望filter訪問控制模式能更完美一點,按照常識,我們希望它能按照數(shù)據(jù)庫里user表里不同級別用戶,實行不同的授權(quán),而不是用硬編碼的形式控制。
回到demo blog,我先對數(shù)據(jù)庫的tbl_user表做修改,在原來的基礎(chǔ)上加上role一項。對原來的用戶信息記錄添加role的value為"管理員"或"一般用戶"。
然后依次執(zhí)行以下3個步驟:
1. 創(chuàng)建組件WebUser,它是對CWebUser的擴展。
2. 修改config/main.php文件。
3.修改accessRules()。
具體細節(jié)如下:
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.找到需要更改權(quán)限的controller類,對accessRules()函數(shù)做修改,比如對前文的accessRules()函數(shù)做如下修改:
復制代碼 代碼如下:
public function accessRules() //這里就是訪問規(guī)則的設(shè)置。 {
return array(
array('allow', // 允許所有用戶執(zhí)行index,view動作。
'actions'=>array('index','view'),
'users'=>array('*'), //*號標識所有用戶包括注冊的、沒注冊的、一般的、管理員級的
),
array('allow', // 只允許經(jīng)過驗證的用戶執(zhí)行create, update動作。
'actions'=>array('create','update'),
'users'=>array('@'), // @號指所有注冊的用戶
),
array('allow', // 只允許用戶名是admin的用戶執(zhí)行admin,delete動作
'actions'=>array('admin','delete'),
'expression'=>'yii::app()->user->isAdmin()',
//這樣只有標識為“管理員”的用戶才能訪問admin,delete動作
),
array('deny', // 拒絕所有的訪問。
'users'=>array('*'),
),
);
工作完成!
您可能感興趣的文章:
- Yii2搭建后臺并實現(xiàn)rbac權(quán)限控制完整實例教程
- Yii2 rbac權(quán)限控制之菜單menu實例教程
- 淺析Yii中使用RBAC的完全指南(用戶角色權(quán)限控制)
- yii2 RBAC使用DbManager實現(xiàn)后臺權(quán)限判斷的方法
- Yii2 rbac權(quán)限控制之rule教程詳解
- yii權(quán)限控制的方法(三種方法)
- 深入淺析Yii admin的權(quán)限控制
- Yii2 rbac權(quán)限控制操作步驟實例教程
- Yii中srbac權(quán)限擴展模塊工作原理與用法分析
- Yii框架ACF(accessController)簡單權(quán)限控制操作示例
相關(guān)文章
經(jīng)典PHP加密解密函數(shù)Authcode()修復版代碼
這篇文章主要介紹了經(jīng)典PHP加密解密函數(shù)Authcode()修復版代碼,需要的朋友可以參考下2015-04-04

php 從指定數(shù)字中獲取隨機組合的簡單方法(推薦)
下面小編就為大家?guī)硪黄猵hp 從指定數(shù)字中獲取隨機組合的簡單方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
2017-04-04