yii学习笔记-权限管理SRbac使用

    最近学习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 

View Code
 1 CREATE TABLE `user` (
 2   `userid` int(11NOT NULL AUTO_INCREMENT,
 3   `username` varchar(50NOT NULL,
 4   `password` varchar(50NOT NULL,
 5   PRIMARY KEY (`userid`)
 6 ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
 7 
 8 -- ----------------------------
 9 -- Records of user
10 -- ----------------------------
11 INSERT INTO `userVALUES ('1''system''54b53072540eeeb8f8e9343e71f28176');
12 INSERT INTO `userVALUES ('2''admin''21232f297a57a5a743894a0e4a801fc3');
13 INSERT INTO `userVALUES ('3''demo''fe01ce2a7fbac8fafaed7c982a04e229');

 接下来编辑系统config文件,连接数据库,使用脚手架gii创建usermodel,接下来就是修改components/UserIdentity.php中authenticate()方法,让应用使用数据库实现登陆

 1 protected $_userid;
 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

 1 <?php
 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文件夹下,然后修改配置文件:

'import' => array(
...
        //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,那么此处会在控制器列表中列出相应的控制器名字。系统以

[ModuleId]/[Subdirectory].[ContollerId][Action]

这样的方式建立授权项,将这些罗列出的授权项列出并建立,建立授权项同时,系统还提供了两个默认的任务,如果不想自己手工建立,也可以使用这两个默认的任务。

 如果有授权项可以允许不需要授权就可以查看,则将其例如允许列表。这里改变一下向前的设想,认为admin/index可以允许访问

以上,授权项建立完成。

接下来分配授权项:

第一步:首先为用户分配角色system-〉system,admin-〉administrator,demo-〉commonUser

第二步:为角色分配任务:

第三步:为任务分配操作,各任务执行的操作如下

 

 

然后可以通过用户已获得授权来查看用户的权限,demo用户权限较少,看起来方便,以他为例

 

 

demo拥有的权限为可以查看alwaysallowed里列出的操作,同时还比未登陆的用户多一个admin/user的操作。

 

 接下来就是实验配置是否成功了。正式使用前有一点十分重要,要将config中srbac中的debug设为false,否则权限验证会失效。

首先不登陆点击admin,可以正常显示,当访问admin/user或admin/setting以及srbac会跳转至登陆页面要求登陆

 然后用demo登陆,根据前面的设计,demo之比为登陆多一个admin/user的权限

然后用admin登陆 ,admin账户已经具备了目前所有的权限,这边源代码存在一些问题,需要修正,在AuthItemController下的beforeAction的最后调用父类的beforeAction时需要一个return关键字,否则页面无法显示。

 再做您一个测试,将system账号的授权任务删除,使用system登陆,可以发现,作为超管账号,他还是有编辑权限的功能。

 

 

 

 

 

 

srbac的使用介绍到这里,点击此处下载


 

 

 

 

 

 

 


 


 

 

 

 

 

 


 


 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2013-05-21 17:11  albafica  阅读(3795)  评论(1编辑  收藏  举报