-------------------------------------------------------------------------------------------------------html
RBAC(Role Based Access Control),意为基于角色的访问控制,这里用户再也不拥有单独权限,而是与角色相关联,经过赋予角色权限,那么该用户也就拥有了这个角色的权限; 这里的角色能够也理解为用户组。数组
权限控制位置:在公共的控制器类的构造方法内,这样子类均需进行权限验证; 登陆注册所在控制器能够不用继承,以CI框架为例:包含登陆的控制器直接继承CI_Controller, 包含其余方法的控制器继承MY_Controller进行权限控制。session
自定义的RBAC类,最终返回组装的数组格式,参考以下:框架
$access_list = array( 'auth'=>array( 'index'=>array( [0]=>'index', [1]=>'add', ), 'user'=>array( [0]=>'index', [1]=>'add', [2]=>'delete', ), ), );
三步骤 实现RBAC =>函数
一,须要的5张数据表以下:this
用户表spa
角色表(用户组)code
用户和角色关联表(便于存单个用户存多个角色; 不然要在用户表存roleid,多个值)xml
权限表(节点表:角色id,节点id,节点pid)htm
角色与权限关联表
(4张表实现的RABC是采用的单角色思路,能够省略掉“用户和角色关联表”,将角色id直接存入用户表,能够省掉一些代码量)
二,经过用户的id获取全部的节点权限:
1. 经过用户的id将用户的角色id查询出来,function getRoleId(){}
2. 经过用户的角色id来获取全部的节点id,function getNodeId(){}
3. 经过全部的节点id来获取节点名称,组装数组(也可存入session),function getNodes(){} function getNodeName(){}
三,验证权限:
经过$_GET['c']和$_GET['m']与$access_list['auth']中的进行对比,若是存在,拥有权限,不然无权限,进行踢出; 这里用到了函数array_key_exists()。
强调:登陆退出在非公共的控制器内,不参与权限控制。
若是有使用了Ajax,那么一样能够验证,代码局部以下:
/**
|---------------------------------------------
|开启权限控制方法(以CI框架为例)
|@黑眼诗人 <www.farwish.com>
|---------------------------------------------
*/
protected function openCheck() { $this->load->library('rbac'); //加载rbac类 if( ! $this->rbac->access_check($id)) //rbac中access_check方法检测权限 { if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { echo '您没有权限!';exit; //Ajax请求返回值 } else { redirect('admin/show_notice'); //重定向至提示页 } } }
你还能够在上述代码中加入判断,如:超级管理员角色不受限制,这样更符合权限系统的需求。
Link: http://www.cnblogs.com/farwish/p/3886805.html
@黑眼诗人 <www.farwishcom>