最近學習yii框架,yii框架作為全球知名的開源框架,很大的一個優點是:有大量成熟的應用拓展。之前學習tp時,我學習了tp提供的rbac權限管理方法。今天我在yii框架的拓展中找到了同樣的SRbac拓展包,它作為yii的一個模塊,使用起來十分方便。下面就記錄一下安裝使用的流程,以備回憶。
首先准備相關的拓展包和基礎程序。srbac的下載地址為:http://www.yiiframework.com/extension/srbac 我下載版本為:srbac_1.2_r228 官網還提供了帶blog-demo的版本,這里我是自己搭建一個簡單的demo,就直接下載源碼包就可以了。測試過程中我為了調錯還下載了兩套debug的拓展包,yii-debug-toolbar和yiidebugtb,前者貌似更強大,至少下載數更多,不過運行時,我遇上一個沒有render的情況,就沒有加載jquery,導致不能使用,這時候,后面那個就顯出優勢了。兩套debug方法的安裝官網拓展包下載頁面有詳細說明,就不說了,畢竟不是srbac必須的。
接下來建立一個簡單的框架骨架,考慮到第一次使用,太復雜的頁面最后很可能分不清,所以最簡單的初始框架可以讓事情簡單很多。我直接使用yiic創建了一個名為yiisrbac的應用。同時建立了一個名為yiisrbac的數據庫,手工創建了一張只有userid,username和password的user表。同時往里面插入了3條初始數據,分別為:超級管理員賬號:system/system系統管理員賬號:admin/admin,普通用戶demo/demo

2 `userid` int( 11) NOT NULL AUTO_INCREMENT,
3 `username` varchar( 50) NOT NULL,
4 `password` varchar( 50) NOT NULL,
5 PRIMARY KEY (`userid`)
6 ) ENGINE =MyISAM AUTO_INCREMENT = 4 DEFAULT CHARSET =utf8;
7
8 -- ----------------------------
9 -- Records of user
10 -- ----------------------------
11 INSERT INTO ` user` VALUES ( ' 1 ', ' system ', ' 54b53072540eeeb8f8e9343e71f28176 ');
12 INSERT INTO ` user` VALUES ( ' 2 ', ' admin ', ' 21232f297a57a5a743894a0e4a801fc3 ');
13 INSERT INTO ` user` VALUES ( ' 3 ', ' demo ', ' fe01ce2a7fbac8fafaed7c982a04e229 ');
接下來編輯系統config文件,連接數據庫,使用腳手架gii創建usermodel,接下來就是修改components/UserIdentity.php中authenticate()方法,讓應用使用數據庫實現登陸
2 public function authenticate(){
3 $user = User::model()->find('username=?', array( $this->username));
4 if( $user === null){
5 $this->errorCode=self::ERROR_USERNAME_INVALID;
6 } elseif( $user->password !== md5( $this->password)){
7 $this->errorCode=self::ERROR_PASSWORD_INVALID;
8 } else{
9 $this->errorCode=self::ERROR_NONE;
10 $this->_userid = $user->userid;
11 }
12 return ! $this->errorCode;
13 }
14 function getId(){
15 return $this->_userid;
16 }
此時,應用最基本的骨架搭建完成。
下一步建立一個簡單的控制器 ,在controller文件夾下新建adminController
2 class adminController extends SBaseController{
3 public function actionIndex(){
4 $this->render('index');
5 }
6
7 public function actionUser(){
8 $this->render('user');
9 }
10
11 public function actionSetting(){
12 $this->render('setting');
13 }
14 }
15 ?>
同樣在view下建立admin文件夾並創建3個視圖文件。創建這3個簡單的控制器方法就是為了驗證srbac權限控制是否成功,最終的設想是,一般用戶只可以看到index頁面,系統管理員以上可以看見所有頁面。
官網提供的用戶手冊有這樣一句話If you also want srbac to automatically check for access in your controllers, your controllers should extend the SBaseController class in srbac module or any other class that extends this one.即:如果你想在你的控制器中自動驗證權限,你的控制器需要繼承自srbac模塊中的SBaseController或其子類。讓控制器繼承SBaseController主要是為了使用SBaseController中的beforeAction方法,這個方法主要是為了驗證當前用戶是否擁有訪問當前控制器中方法的權限。也是srbac在整個應用中起作用的核心所在。已有的項目如果想使用srbac倒也不必修改所有文件,因為按照yii提供的方式,控制器最好均繼承自components\controller,只要修改這個文件繼承自SBaseController即可。當然如果沒有繼承自這個controller直接修改控制器文件的父類就可以了。
接下來將下載的拓展包中的srbac文件解壓放置到modules文件夾下,然后修改配置文件:
...
// SRBAC權限管理 'application.modules.srbac.controllers.SBaseController',
),
'language' => 'zh_CN',
'modules' => array(
...
'srbac' => array(
'userclass' => 'User', // default: User 對應用戶的model
'userid' => 'userid', // default: userid 用戶表標識位對應字段
'username' => 'username', // default:username 用戶表中用戶名對應字段
'delimeter' => '@', // default:- item分隔符
'debug' => false, // default :false 調試模式,true則所有用戶均開放,可以隨意修改權限控制
'pageSize' => 10, // default : 15
'superUser' => 'system', // default: Authorizer 超級管理員,這個賬號可以不受權限控制的管理,對所有頁面均有訪問權限
'css' => 'srbac.css', // default: srbac.css 樣式文件
'layout' =>
'application.views.layouts.main', // default: application.views.layouts.main,must be an existing alias
'notAuthorizedView' => 'srbac.views.authitem.unauthorized', // default:srbac.views.authitem.unauthorized, must be an existing alias
'alwaysAllowed' => array( // default: array() 總是允許訪問的動作
'SiteLogin', 'SiteLogout', 'SiteIndex', 'SiteAdmin',
'SiteError', 'SiteContact',
),
// 'userActions' => array('Show', 'View', 'List'), //default: array()
'listBoxNumberOfLines' => 15, // default : 10
'imagesPath' => 'srbac.images', // default: srbac.images
'imagesPack' => 'noia', // default: noia
'iconText' => true, // default : false
'header' => 'srbac.views.authitem.header', // default : srbac.views.authitem.header,must be an existing alias
'footer' => 'srbac.views.authitem.footer', // default: srbac.views.authitem.footer,must be an existing alias
'showHeader' => true, // default: false
'showFooter' => true, // default: false
'alwaysAllowedPath' => 'srbac.components', // default: srbac.components,must be an existing alias
),
...
),
// application components
'components' => array(
'authManager' => array(
// Path to SDbAuthManager in srbac module if you want to use case insensitive
//access checking (or CDbAuthManager for case sensitive access checking)
'class' => 'application.modules.srbac.components.SDbAuthManager',
// The database component used
'connectionID' => 'db',
// The itemTable name (default:authitem) 授權項表
'itemTable' => 'items',
// The assignmentTable name (default:authassignment) 權限分配表
'assignmentTable' => 'assignments',
// The itemChildTable name (default:authitemchild) 任務對應權限表
'itemChildTable' => 'itemchildren',
),
),
...
這個配置文件定義了srbac的基本配置項,實現權限控制用到了3張表,如果這三張表不存在,系統首次運行時會提示建立這三張表后才能正常使用。
安裝數據表時會詢問是否建立示例數據,下面我會自己配置數據,默認數據就不建立了。
權限管理頁面提供了3個選項,如上圖所示。
首先進行授權項的管理。授權項存儲在數據庫中的items表中,授權項共分為3種:operation,task,role
首先是role,即角色,rbac就是基於角色的權限控制,角色是權限分配的主體。系統使用配置文件中的'superUser' => 'system',建立了一個超級管理員組,我們在手動新建兩個角色,一個是管理員角色,可以開放給用戶進行系統的配置,一個普通用戶角色,具備系統的一般權限。
系統為了方便操作提供了一個自動建立授權項的方法,如果控制器繼承自SBaseController,那么此處會在控制器列表中列出相應的控制器名字。系統以
這樣的方式建立授權項,將這些羅列出的授權項列出並建立,建立授權項同時,系統還提供了兩個默認的任務,如果不想自己手工建立,也可以使用這兩個默認的任務。

如果有授權項可以允許不需要授權就可以查看,則將其例如允許列表。這里改變一下向前的設想,認為admin/index可以允許訪問

以上,授權項建立完成。
接下來分配授權項:
第一步:首先為用戶分配角色system-〉system,admin-〉administrator,demo-〉commonUser
第二步:為角色分配任務:



接下來就是實驗配置是否成功了。正式使用前有一點十分重要,要將config中srbac中的debug設為false,否則權限驗證會失效。
首先不登陸點擊admin,可以正常顯示,當訪問admin/user或admin/setting以及srbac會跳轉至登陸頁面要求登陸
然后用admin登陸 ,admin賬戶已經具備了目前所有的權限,這邊源代碼存在一些問題,需要修正,在AuthItemController下的beforeAction的最后調用父類的beforeAction時需要一個return關鍵字,否則頁面無法顯示。
srbac的使用介紹到這里,點擊此處下載