自带的不带管理功能,直接用的是srbac
1.下载extension
http://www.yiiframework.com/extension/srbac/
2.解压到module目录下
注意:要给目录分配合理的权限,我的是755,而将其用户组更改为www-data,这样就不会出现srbaAlias "srbac.SrbacModule" is invalid 这个错误 了。
3.编辑main.config如下:
a.modules
- 'modules'=>array(
- // uncomment the following to enable the Gii tool
- 'gii'=>array(
- 'class'=>'system.gii.GiiModule',
- 'password'=>'123456',
- // If removed, Gii defaults to localhost only. Edit carefully to taste.
- 'ipFilters'=>array('127.0.0.1','::1'),
- ),
- 'Admin'=>array(
- 'class'=>'application.modules.admin.AdminModule',
- ),
- 'srbac' => array(
- 'userclass'=>'User', //default: User
- 'userid'=>'user_id', //default: userid
- 'username'=>'username', //default:username
- 'delimeter'=>'@', //default:-
- 'debug'=>true, //default :false
- 'pageSize'=>10, // default : 15
- 'superUser' =>'Authority', //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 )
- ),
- ),
b.import
- 'import'=>array(
- 'application.models.*',
- 'application.components.*',
- 'application.modules.srbac.controllers.SBaseController',
- ),
c.components
- // application components
- 'components'=>array(
- 'user'=>array(
- // enable cookie-based authentication
- 'allowAutoLogin'=>true,
- //'loginUrl'=>array('auth/login')
- ),
- //SRBAC
- 'authManager' => array(
- 'class'=>'srbac.components.SDbAuthManager',
- // The database component used
- 'connectionID'=>'db',
- // The itemTable name (default:authitem)
- 'itemTable'=>'authitem',
- // The assignmentTable name (default:authassignment)
- 'assignmentTable'=>'authassignment',
- // The itemChildTable name (default:authitemchild)
- 'itemChildTable'=>'authitemchild',
- ),
4.然后通过 http://gm.me/snsplus_intranet/index.php?r=srbac/authitem来访问,会建立三张表,然后开始配置就可
RBAC即为role-based access control,它要解决的问题就是“谁能做什么”,分析此句,两大因素,人物(谁),动作(做什么)。
人物,在RBAC里分为两层,一层叫user,一层叫role。
张三是user,他可能同时拥有多个role,比如“注册用户”,“版主”,“帖子创建者”等。
user好解释,表中的某行就意味着一个user。
但角色,是由一个业务规则,或是说一个逻辑来指定的。比如“注册用户”的逻辑是“!Yii::app()->user->isGuest”,“版主”的逻辑是“in_array(Yii::app()->user->id, $board->owner_ids)”,“帖子创建者”的逻辑就是“Yii::app()->user->id == $post->user_id”。
如果这个逻辑判断为真,那么当前用户就属于这个角色。
动作,这也分两层。一层叫operation,一层叫task。
operation,是指一个原子操作。
而一个task可能包括了多个operation。
举个例子来说,“管理帖子”这个task就包括了“创建帖子”、“删除帖子”,“修改帖子”、“查看帖子”、“帖子列表”这四个operation。而“查看帖子”可能只包括了“查看帖子”、“帖子列表”这两个operation。
要执行权限检查,我们首先需要知道授权项目的名字。例如,要检查当前用户是否可以创建帖子,我们需要检查他是否拥有 createPost
所表示的权限。然后我们调用CWebUser::checkAccess 执行权限检查:
- if(Yii::app()->user->checkAccess('createPost'))
- {
- // 创建帖子
- }
如果授权规则关联了一条需要额外参数的业务规则,我们也可以传递给它。例如,要检查一个用户是否可以更新帖子,我们可以通过 $params
传递帖子的数据:
- $params=array('post'=>$post);
- if(Yii::app()->user->checkAccess('updateOwnPost',$params))
- {
- // 更新帖子
- }
许多 Web 程序需要一些可以分配给系统中所有或大多数用户的比较特殊的角色。例如,我们可能想要分配一些权限给所有已通过身份验证的用户。如果我们特意指定并存储这些角色分配,就会引起很多维护上的麻烦。我们可以利用默认角色 解决这个问题。
默认角色就是一个隐式分配给每个用户的角色,这些用户包括通过身份验证的用户和游客。我们不需要显式地将其分配给一个用户。当 CWebUser::checkAccess 被调用时,将会首先检查默认的角色,就像它已经被分配给这个用户一样。
默认角色必须定义在 CAuthManager::defaultRoles 属性中。例如,下面的配置声明了两个角色为默认角色:authenticated
和guest
。
- return array(
- 'components'=>array(
- 'authManager'=>array(
- 'class'=>'CDbAuthManager',
- 'defaultRoles'=>array('authenticated', 'guest'),
- ),
- ),
- );
由于默认角色会被分配给每个用户,它通常需要关联一个业务规则以确定角色是否真的要应用到用户。例如,下面的代码定义了两个角色, authenticated
和guest
,很高效地分别应用到了已通过身份验证的用户和游客用户。
- $bizRule='return !Yii::app()->user->isGuest;';
- $auth->createRole('authenticated', 'authenticated user', $bizRule);
- $bizRule='return Yii::app()->user->isGuest;';
- $auth->createRole('guest', 'guest user', $bizRule);
关于rbac的一个实例:
/config/main.php
- 'authManager' => array(
- //'class'=>'application.modules.srbac.components.SDbAuthManager',
- 'class'=>'CDbAuthManager',
- // The database component used
- 'connectionID'=>'db',
- // The itemTable name (default:authitem)
- 'itemTable'=>'authitem',
- // The assignmentTable name (default:authassignment)
- 'assignmentTable'=>'authassignment',
- // The itemChildTable name (default:authitemchild)
- 'itemChildTable'=>'authitemchild',
- ),
site控制器的initauth
- public function actionInitauth(){
- $auth=Yii::app()->authManager;
- $auth->createOperation('createPost','create a post');
- $auth->createOperation('readPost','read a post');
- $auth->createOperation('updatePost','update a post');
- $auth->createOperation('deletePost','delete a post');
- //此处的$params是以后要验证的时候checkAccess传进来的参数
- //比如,如果我是帖子的作者,我当前登录的uid是1,那么下面就赋予uid 1 作者这个角色,这样我就可以修改我自己的帖子
- $bizRule='return Yii::app()->user->id==$params["post_uid"];';
- $task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule);
- $task->addChild('updatePost');
- $role=$auth->createRole('reader');
- $role->addChild('readPost');
- $role=$auth->createRole('author');
- $role->addChild('reader');
- $role->addChild('createPost');
- $role->addChild('updateOwnPost');
- $role=$auth->createRole('editor');
- $role->addChild('reader');
- $role->addChild('updatePost');
- $role=$auth->createRole('admin');
- $role->addChild('editor');
- $role->addChild('author');
- $role->addChild('deletePost');
- $auth->assign('reader',1);
- //赋予uid1为author角色
- $auth->assign('author','1');
- $auth->assign('editor','3');
- $auth->assign('admin','12');
- }
初始化之后,然后如果你要验证权限updateOwnPost,其实这个权限既可以是task,亦可以是operation
- $params = array('post_uid' => 1);
- $result = Yii::app()->user->checkAccess('updateOwnPost', $params);
- //此处的假如我知道发布帖子的这个人的uid是1,真实情况下需要做一次查询,这样就会根据之前设置权限的时候的bizRule做复杂一点的自定义校验
- /*
- $bizRule='return Yii::app()->user->id==$params["post_uid"];';
- $task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule);
- */
- 这样的话返回的结果就是true