YII framework下基于角色的访问控制(RBAC),权限设置 yii下,filters()和accessControl()是YII基本的访问控制体系, public function filt

yii下,filters()和accessControl()是YII基本的访问控制体系,
public function filters(){
    return array(
           'accessControl',
    );
}

public function accessControl(){
    return array(
        array(
            'allow', //allow or deny 允许或者拒绝
            'controllers' => array('controllersList'), //对控制器进行访问控制
            'actions' => array('actionsList'), //对action进行访问控制
            'users' => array('usersList'), //对用户
            'roles' => array('roles'), //对角色
            'ips' => array('ip 地址'), //对客户端地址
            'verbs' => array('GET','POST'), //对客户端的请求方式
            'expression' => '' //对表达式(一般是业务逻辑)
            'message' => 'thank your access', //错误信息提示,一般是deny时用到
         ),
       array(....),
       ....
       array('deny', users => array('*')),
    );
}

好了,有了以上的访问控制,我们针对上面的roles进行讨论RBAC。
Yii的RBAC是基于一个组件authManager的,可以先在main。php中配置authManager
authManger分为基于数据库的和基于PHP脚本的,一般如果你的应用程序基于数据库(mysql或者pgsql),最好把authManger配置为CDbAuthManger,而不是CPhpAuthManger。
...
'authManager' => array(
     'class' => 'CDbAuthManager',
     'connectionID' => 'db',
),

'db' => array(...),
...

配置好了以后,需要在数据库中增加3个存放RBAC规则的表:
AuthItem -- 存放建立的授权项目(role、task或者opration)
AuthItemChild -- 存放授权项目的继承关系
AuthAssignMent -- 存放用户和授权项目的关系表


  1. CREATE TABLE `authitem` ( 
  2.             `name` varchar(64) NOT NULL, 
  3.             `type` int(11) NOT NULL, 
  4.             `description` text, 
  5.             `bizrule` text, 
  6.             `data` text, 
  7.             PRIMARY KEY (`name`) 
  8.           ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1. CREATE TABLE `authitemchild` ( 
  2.                  `parent` varchar(64) NOT NULL, 
  3.                  `child` varchar(64) NOT NULL, 
  4.                  PRIMARY KEY (`parent`,`child`), 
  5.                  KEY `child` (`child`), 
  6.                  CONSTRAINT `authitemchild_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `authitem` (`name`) ON DELETE CASCADE ON UPDATECASCADE, 
  7.                  CONSTRAINT `authitemchild_ibfk_2` FOREIGN KEY (`child`) REFERENCES `authitem` (`name`) ON DELETE CASCADE ON UPDATECASCADE 
  8.                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  1. CREATE TABLE `authassignment` ( 
  2.                   `itemname` varchar(64) NOT NULL, 
  3.                   `userid` varchar(64) NOT NULL, 
  4.                   `bizrule` text, 
  5.                   `data` text, 
  6.                   PRIMARY KEY (`itemname`,`userid`), 
  7.                   CONSTRAINT `authassignment_ibfk_1` FOREIGN KEY (`itemname`) REFERENCES `authitem` (`name`) ON DELETE CASCADE ON UPDATECASCADE 
  8.                 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建好表以后,就可以用Yii提供的authManger组件的API建立相关的授权项目,并指定授权关系了。

下面是一个例子:

下面做一个实例:
YII <wbr>framework下基于角色的访问控制(RBAC) 
我们要实现上面的授权关系。


  1. class AuthManagerController extends Controller {
  2.     public function actionIndex(){
  3.         $auth = Yii::app()->authManager;
  4.         
  5.         if ($auth !== NULL){
  6.             $auth->clearAll();
  7.             //create roles
  8.             $roleOwner = $auth->createRole('owner');
  9.             $roleReader = $auth->createRole('reader');
  10.             $roleMember = $auth->createRole('member');
  11.             $roleBlackList = $auth->createRole('blackList');

  12.             //create operations
  13.             //issues
  14.             $auth->createOperation('createIssue', 'create issue in project');
  15.             $auth->createOperation('readIssue', 'read issue');
  16.             $auth->createOperation('updateIssue', 'update issue');
  17.             $auth->createOperation('deleteIssue', 'delete issue');

  18.             //projects
  19.             $auth->createOperation('createProject', 'create a new project');
  20.             $auth->createOperation('readProject', 'read project');
  21.             $auth->createOperation('updateProject', 'update project');
  22.             $auth->createOperation('deleteProject', 'delete project');

  23.             //users
  24.             $auth->createOperation('createUser', 'create a new user');
  25.             $auth->createOperation('readUser', 'read user');
  26.             $auth->createOperation('updateUser', 'update user');
  27.             $auth->createOperation('deleteUser', 'delete user');

  28.             //authorization
  29.             $roleReader->addChild('readIssue');
  30.             $roleReader->addChild('readProject');
  31.             $roleReader->addChild('readUser');

  32.             $roleMember->addChild('reader');
  33.             $roleMember->addChild('createIssue');
  34.             $roleMember->addChild('updateIssue');
  35.             $roleMember->addChild('deleteIssue');

  36.             $roleOwner->addChild('reader');
  37.             $roleOwner->addChild('member');
  38.             $roleOwner->addChild('createProject');
  39.             $roleOwner->addChild('updateProject');
  40.             $roleOwner->addChild('deleteProject');
  41.             $roleOwner->addChild('createUser');
  42.             $roleOwner->addChild('updateUser');
  43.             $roleOwner->addChild('deleteUser');

  44.             //assign
  45.             //此时,在Issue中的rules中设置view和index的roles=>array('member'),不管是什么用户,都无法访问这两个action
  46.             $userAdmin = User::model()->findByAttributes(array('username' => 'admin'));
  47.             $auth->assign('owner', $userAdmin->id);
  48.             $auth->assign('member', $userAdmin->id); //将用户名为admin(id=3)指定为member角色,这样就可以访问了。
  49.             $auth->assign('reader', $userAdmin->id);

  50.             $userDemo = User::model()->findByAttributes(array('username' => 'demo'));
  51.             $auth->assign('member', $userDemo->id); //将用户名为admin(id=3)指定为member角色,这样就可以访问了。
  52.             $auth->assign('reader', $userDemo->id); //将用户名为demo(id=4)指定为reader角色
  53.             
  54.             $userDemo2 = User::model()->findByAttributes(array('username' => 'demo2'));
  55.             $auth->assign('reader', $userDemo2->id); //将用户名为demo(id=4)指定为reader角色

  56.             $userBlackList = User::model()->findByAttributes(array('username' => 'demo3'));
  57.             $auth->assign('blackList', $userBlackList->id);
  58.         }else{
  59.             $message = 'Please config your authManage as a compontion in main.php';
  60.             throw new CHttpException(0, $message);
  61.         }
  62.     }
  63. }
建立授权关系以后,更新accessRules为:
  1. public function accessRules()
  2.     {
  3.         return array(
  4.             array('allow', // allow all users to perform 'index' and 'view' actions
  5.                 'actions'=>array('index','view'),
  6.                 'users'=>array('@'),
  7.                                 'roles' => array('member', 'owner', 'reader'),
  8.             ),
  9.             array('allow', // allow authenticated user to perform 'create' and 'update' actions
  10.                 'actions'=>array('create','update'),
  11.                 'users'=>array('@'),
  12.                                 'roles' => array('member', 'owner'),
  13.             ),
  14.             array('allow', // allow admin user to perform 'admin' and 'delete' actions
  15.                 'actions'=>array('admin','delete'),
  16.                 'users'=>array('@'),
  17.                                 'roles' => array('owner'),
  18.             ),
  19.             array('deny', // deny all users
  20.                 'users'=>array('*'),
  21.             ),
  22.         );
  23.     }
就是把刚刚建立的授权项目加入到访问控制列表中。

另外一个例子
  1. $auth = Yii::app()->authManger;
  2. $roleManager = $auth->createRole('manager'); //建立一个角色

  3. $auth->createTask('projectManager'); //建立任务
  4. $auth->createTask('userManager');

  5. $auth->createOpration('createProject'); //建立操作
  6. $auth->createOpration('updateProject');
  7. $auth->createOpration('deleteUser');

  8. $user = User::model()->findByPk('1'); //检索用户
  9. $roleManager->addChild('projectManager'); //为角色授权任务
  10. $roleManager->addChild('updateProject');//为角色授权操作
  11. $auth->assign('manager', $user->id);//指定用户权限

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

YII非rbac通用权限,controller中加权限过滤器beforeaction

Java代码  getId(); } if ($module === null && $this->getModule()) { $module = $this->getModule()->getId(); } return Privilege::model()->checkPower($module, $contrl, $action); } public function beforeAction($action) { $contrl = $this->getId(); $actionId = $action->getId(); $route = $contrl . '/' . $actionId; if (!in_array($route, array('site/login', 'site/error', 'site/logout')) && Yii::app()->user->id != 1) { $module = null; if ($action && $this->getModule()) { $module = $this->getModule()->getId(); } $this->purview($module, $contrl, $actionId); } return parent::beforeAction($action); }" wmode="transparent">  收藏代码
  1. public function purview($module, $control, $action)  
  2.     if (!$this->checkPower($action, $control, module))  
  3.         throw new CHttpException(403'您没有访问权限!');  
  4.         Yii::app()->end();  
  5.      
  6.  
  7.   
  8. // CGRIDVIEW buttonID 'visible' =>'$this->grid->controller->checkPower("delete")',  
  9. public function checkPower($action, $contrl null$module null 
  10.     if ($contrl === null 
  11.         $contrl $this->getId();  
  12.      
  13.   
  14.     if ($module === null && $this->getModule())  
  15.         $module $this->getModule()->getId();  
  16.      
  17.   
  18.     return Privilege::model()->checkPower($module, $contrl, $action);  
  19.  
  20. public function beforeAction($action)  
  21.     $contrl $this->getId();  
  22.     $actionId $action->getId();  
  23.     $route $contrl '/' $actionId;  
  24.     if (!in_array($route, array('site/login''site/error''site/logout')) && Yii::app()->user->id != 1 
  25.         $module null 
  26.         if ($action && $this->getModule())  
  27.             $module $this->getModule()->getId();  
  28.          
  29.         $this->purview($module, $contrl, $actionId);  
  30.      
  31.     return parent::beforeAction($action);  
  32.  

在这里的visible表达式中设置调用$this->checkPower('操作名');就可以隐藏没有权限访问的菜单了

 

RBAC0 定义了能构成一个RBAC控制系统的最小的元素集合
在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素,权限被赋予角色,而不是用户,当一个角色被指定给一个用户时,此用户就拥有了该角色所包含的权限。会话sessions是用户与激活的角色集合之间的映射。RBAC0与传统访问控制的差别在于增加一层间接性带来了灵活性,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展。
RBAC1 引入角色间的继承关系
角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构。
RBAC2 模型中添加了责任分离关系
RBAC2 的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可。
RBAC3 包含了RBAC1和RBAC2

 

YII提供了2套权限访问系统,一套是简单的filter(过滤器)模式,另一套是复杂全面的RBAC模式,两者之间,前者先于后者。即访问的控制判断机制有个先后顺序:先进行访问控制过滤器的判断,再进行角色访问控制判断。而RBAC和默认的按照users的原理一样。通过指定”roles”来限定对应角色用户的可用action的权限。用”roles”替 换”users”即可,因为Yii的accessControl是支持roles的。通过这种方式,在Contoller内部,通过指定 accessRules就可以控制权限。在其他地方,比如控制一些view的显示的时候,可以用 Yii::app()->user->checkAccess(role)来进行权限判断。
RBAC本身也有特别之处。看官方的一段原话:
在Yii的RBAC的一个基本概念是authorization item(授权项目)。一个授权项目是一个做某事的许可(如创造新的博客发布,管理用户)。根据其粒度和targeted audience, 授权项目可分为operations(行动),tasks(任务)和 roles(角色)。角色包括任务,任务包括行动,行动是许可是个原子。 例如,我们就可以有一个administrator角色,包括post management和user management任务。user management 任务可能包括create user,update user和delete user行动。为了更灵活,Yii也可以允许角色包括其他角色和动作,任务包括其他任务,行动包括其他行动。
也就是说在Yii::app()->user->checkAccess(role)的时候,role可以是operations,tasks和roles。

rights,srbac可视化配置,自动安装表 http://www.yiiframework.com/extension/srbac/但是一定要弄懂Yii的内部 rbac 因为这扩展个都是建立在这个基础上的.


 

开始准备 
Yii提供了强大的配置机制和很多现成的类库。在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码。所以准备工作就是,打开编辑器,跟我来。 设置参数、建立数据库 
在配置数组中,增加以下内容:

srbac 

Java代码    收藏代码
  1. 'components' => array(  
  2.     'authManager' => array(  
  3.         'class' => 'srbac.components.SDbAuthManager' 
  4.         'connectionID' => 'db'//使用的数据库组  
  5.         'itemTable' => 'tbl_items'// 授权项目表 (默认:authitem)  
  6.         'assignmentTable' => 'tbl_assignments'// 授权分配表 (默认:authassignment)  
  7.         'itemChildTable' => 'tbl_itemchildren'// 授权子项目表 (默认:authitemchild)  
  8.     ),  
  9. ),  

注意这里,'class'=>'srbac.components.SDbAuthManager', 手册上写的错了

那这三个数据表怎么建立呢?很简单,去看framework/web/auth/schema.sql。注意要和你的自定义的表名称对应起来。然后在数据库中运行这个SQL文件中的语句。

修改对应的配置

Java代码    收藏代码
  1. 'modules' => array(  
  2.     'srbac' => array(  
  3.         'userclass' => 'Member'//default: User  
  4.         'userid' => 'mid'//default: userid  
  5.         'username' => 'username'//default:username  
  6. ****  

index.php?r=srbac,安装成功可以删除modules\srbac\views\authitem\install文件夹也可以重命名。然后找到protected\modules\srbac\controllers\AuthitemController.php注释掉beforeAction方法中代码。

Java代码  redirect(array("install")); return false; }" wmode="transparent">  收藏代码
  1. if (!$this->module->isInstalled() && $action->id != "install" 
  2.   $this->redirect(array("install"));  
  3.   return false 
  4.  

 rights有4个表在data下

Java代码    收藏代码
  1. 'import' => array(  
  2.     // rights  
  3.     'application.modules.rights.*' 
  4.     'application.modules.rights.models.*' 
  5.     'application.modules.rights.components.*'// Correct paths if necessary.  
  6. ),  
  7.   
  8. 'modules' => array(  
  9.     'rights' => array(  
  10.         //'debug' => true,  
  11.         'install' => true 
  12.         //'enableBizRuleData' => true,  
  13.     ),  
  14. ),  
  15. 'components' => array(  
  16.     'authManager' => array(  
  17.         'class' => 'RDbAuthManager' 
  18.         'connectionID' => 'db' 
  19.         'itemTable' => 'r_auth_item' 
  20.         'itemChildTable' => 'r_auth_item_child' 
  21.         'assignmentTable' => 'r_auth_assignment' 
  22.         'rightsTable' => 'r_rights' 
  23.     ),  
  24.     'user' => array(  
  25.         'class' => 'RWebUser' 
  26.     ),  
  27.  

rights 

Java代码    收藏代码
  1. class Controller extends RController  
  2.     public function filters()  
  3.         return array(  
  4.             'rights' 
  5.         );  
  6.      
  7.  

进行赋权

我们建立了RBAC权限管理,就需要进行对权限的WEB管理。这些就需要你自己写代码了。
根据不同种类的项目调用下列方法之一定义授权项目 

    * CAuthManager::createRole
    * CAuthManager::createTask
    * CAuthManager::createOperation

一旦我们拥有一套授权项目,我们可以调用以下方法建立授权项目关系:
    * CAuthManager::addItemChild
    * CAuthManager::removeItemChild
    * CAuthItem::addChild
    * CAuthItem::removeChild

最后,我们调用下列方法来分配角色项目给各个用户:
    * CAuthManager::assign
    * CAuthManager::revoke

权限数据的添加 项目调用定义授权项目后会在table中插入相应的数据

2.

Java代码  authID;'; $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','readerA'); $auth->assign('author','authorB'); $auth->assign('editor','editorC'); $auth->assign('admin','adminD'); echo "Done."; } public function actionDeletePost() { echo "Post deleted."; } public function actionTest() { $post = new stdClass(); $post->authID = 'authorB'; echo "Current permissions:
"; echo "
  • "; echo "
  • Create post: ".Yii::app()->user->checkAccess('createPost')."
  • "; echo "
  • Read post: ".Yii::app()->user->checkAccess('readPost')."
  • "; echo "
  • Update post: ".Yii::app()->user->checkAccess('updatePost', array('post' => $post))."
  • "; echo "
  • Delete post: ".Yii::app()->user->checkAccess('deletePost')."
  • "; echo "
"; } }" wmode="transparent"> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值