ThinkPHP下的RBAC权限访问理解【笔记】
来源:互联网 发布:南方报业 知乎 编辑:程序博客网 时间:2024/06/09 19:34
流程:
总共有3张表,权限,角色,管理员 其中角色表为中间连接纽带
1.完善角色表,实现增删改差,以及为角色分配权限的功能,保存权限的ID与action controller在role表,方便后便用2.完善权限表,实现增删改查,分配对应的权限3.完善管理员列表,分配对应的角色
原理:
问:left.html根据不同管理员身份显示不同分类列表?答:根本--role表里的role_auth_ids 进行判断,根据SQL语句的IN字段来查询对应数据【若为管理员时,if判断来绕开in操作,从而全部查询出来】问:如何防止专业人员手动输入URL来进入不是自己权限的页面?答:根本-- role表里的 role_ath_ac字段 在后台的所有控制器中,继承一个总控制器,在总控制器的构造方法进行动态判断权限【CONTROLLER_NAME,ACTION_NAME】是实现动态识别的关键
总结:
role表是三个表的中间联系,也是实现不同管理员分权的关键。 关键性的查询判断,从分权的操作,role表主角,其他俩表辅助。
//-----右边页面为何手动输入URL,访问权限外的页面会提示无权限?【AdminController.class.php/__contruct(){}】-----//1.若当前访问的方法不再公共允许的方法内;2.若不是超级管理员;3.若不再该管理员角色权限的允许的页面内//则发出没有权限提示【$now_ac里的两个常量是关键,自动识别当前是哪个控制器下的方法】$now_ac =CONTROLLER_NAME."-".ACTION_NAME;$allow_ac = array('Index-left','Index-right','Index-head','Index-index','Manager-login','Index-modifypwd','Index-verifyImg');$auth_ac = $auth_ac[0]['role_auth_ac'];//从数据库查询出来的有权限的页面if(!in_array($now_ac,$allow_ac) && $_SESSION['mg_id'] !=1 && strpos($auth_ac,$now_ac) === false){ $this->error('没有访问权限',U("right")); }
//------左部列表为何不同管理显示不同的导航?【index.class.php/left(){}】------ // // 查询list操作列表 // @return 三维数组 // $arr['p_list'] 包含所有顶级列表的二维数组 // $arr['c_list'] 包含所有二级列表的二维数组 // 上述两个组合成一个三维数组返回 // function get_list(){ $mg = M('cms_manager'); $role = M('cms_role'); $role_id = $mg->field("mg_role_id")->where("mg_id=$_SESSION[mg_id] ")->find(); $auth_ids = $role->field("role_auth_ids")->where("role_id=$role_id[mg_role_id] ")->find(); $sql = "SELECT auth_id,auth_name FROM cms_auth WHERE auth_level='0'"; if($_SESSION['mg_id'] !="1") $sql.= " and auth_id in ($auth_ids[role_auth_ids]) "; $p_list = $mg->query($sql); $sql = "SELECT auth_id,auth_pid,auth_name,auth_a FROM cms_auth WHERE auth_level='1'"; if($_SESSION['mg_id'] !="1") $sql.= " and auth_id in ($auth_ids[role_auth_ids]) "; $c_list = $mg->query($sql); $all_list=array( "p_list"=>$p_list, "c_list"=>$c_list, ); // show($all_list);exit; return $all_list; }
**一.rbac权限管理 【必须等项目大体作完,最后来做】** role base access (基于角色的访问权限控制)
sw_auth //权限表
`auth_id` 主键 `auth_name` 权限名称, `auth_pid` 父id,值:对应最高权限的ID, 它若是最高权限则没有,值为0【目的在于,方便下拉菜单显示,有个匹配,是谁的下拉菜单】 `auth_c` 控制器,controller控制器 Goods ; 它若是最高权限则没有,值无【目的在防止直接访问URL突破权限,规定你只能访问它】 `auth_a` 操作方法,action 方法 showlist; 它若是最高权限则没有,值无【目的在防止直接访问URL突破权限,规定你只能访问它】 `auth_path` 全路径:【用户信息排序使用】 【目的在权限管理LIST查看来排序,好看】 ① : 如果是顶级权限,全路径等于本记录主键值 (auth_id) ② :如果不是顶级权限,全路径等于 "父级全路径-(中恒线)本记录主键值" (auth_pid-auth_id) `auth_level` 级别, 【目的在于sql区分下拉菜单时,谁是1级菜单,谁是2级菜单】 基本:0顶级权限 1次顶级权限 2次次顶级 权限呈现缩进关系使用 权限数据模拟:
insert into sw_auth values (1,'商品管理',0,'','',1,0); insert into sw_auth values (2,'订单管理',0,'','',2,0); insert into sw_auth values (3,'广告管理',0,'','',3,0); insert into sw_auth values (4,'商品列表',1,'Goods','showlist',"1-4",1); insert into sw_auth values (5,'添加商品',1,'Goods','add',"1-5",1); insert into sw_auth values (6,'商品分类',1,'Goods','cate',"1-6",1); insert into sw_auth values (7,'用户评论',1,'User','comment',"1-7",1); insert into sw_auth values (8,'订单列表',2,'Order','showlist',"2-8",1); insert into sw_auth values (9,'订单打印',2,'Order','print',"2-9",1); insert into sw_auth values (10,'添加订单',2,'Order','add',"2-10",1); insert into sw_auth values (11,'广告列表',3,'Advert','showlist',"3-11",1); insert into sw_auth values (12,'广告位置',3,'Advert','position',"3-12",1);
sw_role //角色表
`role_id` 主键 `role_name` '角色名称', `role_auth_ac` '模块-操作',关联权限的控制器、方法连接的信息"Goods-showlist,Goods-add,Goods-cate"【目的在于,懂行人直接输入URL访问更多权限】 `role_auth_ids` 外键'该角色的对应权限ID',"1,4,5,6" 关联权限的主键值用逗号连接的信息(如果有上级权限,也把上级权限的id进行关联)
insert into sw_role values (1, '经理', "1,4,5,6","Goods-showlist,Goods-add,Goods-cate"); insert into sw_role values (2, '主管', "2,3,8,11","Order-showlist,Advert-showlist");
**sw_admin //管理员表** `mg_id` 主键 `mg_name` 管理员账户名 `mg_pwd` 管理员密码 `mg_time` 上次登录时间, `mg_role_id` 外键,角色id,二.通过模拟好的数据进行程序开发 a)用户登录系统,根据具体角色显示,左边权限按钮 b)在左边显示对应的权限信息 i.用户登陆系统显示权限信息$_SESSION['mg_id'] ii.根据SESSION['mg_id']信息获得角色信息['role_id'] iii.根据['role_id']信息获得权限列表信息['auth_id,name']三.超级管理员不需要权限控制admin a)在Index/left方法里边,若为admin,则显示全部权限 if($_SESSION['mg_id'] != 1 ){$sql .= " and auth_id in ($auth_ids)";}四.防止内行手输入URL访问更多权限 加入判断 1.用户访问的控制器和方法,必须和他对应的角色表里的【ac信息】比较 2.`role_auth_ac`若有你访问的权限,则访问 因为是后台每一个页面都要验证,把它写一个父类,把所有公共方法写入它,让所有后台方控制器继承它 位置: Component\AdminController.class.php 注意: 1.一些公有的方法,不进行权限限制 2.系统管理员,不进行权限限制 3.只允许访问角色对应的权限 【好好看看if判断的写法,理解】维护三部分数据:角色,权限,1.角色 Admin/Role/showlist 角色:显示角色列表信息,给角色分配权限 在设置时,把已经有的权限显示出来2.权限维护
0 0
- ThinkPHP下的RBAC权限访问理解【笔记】
- ThinkPHP下的RBAC权限访问理解【笔记】
- (ThinkPHP 1.5)基于RBAC的权限访问控制-实例解析
- ThinkPHP的RBAC权限控制
- Thinkphp的RBAC权限管理
- THINKPHP 的 RBAC 权限总结
- 继续摘抄:(ThinkPHP 1.5)基于RBAC的权限访问控制-实例解析
- Thinkphp RBAC权限配置
- RBAC基于角色的访问控制 thinkphp
- thinkphp中的rbac权限控制数据库的全面解析(个人笔记)
- ThinkPHP学习笔记(十九)权限管理的实现方式RBAC
- Thinkphp下的RBAC权限管理完结——2015/5/12
- thinkphp RBAC权限节点递归
- Thinkphp的RBAC,基于角色的权限控制
- ThinkPHP与RBAC:基于角色的权限管理
- ThinkPHP中RBAC的权限控制之配置文件2
- ThinkPHP与RBAC:基于角色的权限管理
- ThinkPHP的RBAC(基于角色权限控制)详解
- Processing 教程(7) - 平移、旋转、放缩
- 1009. 说反话 (20)
- PHP 设计模式之观察者模式
- React实践系列笔记-Library
- HDU 3231 Box Relations(拓扑排序)
- ThinkPHP下的RBAC权限访问理解【笔记】
- c++的深拷贝和浅拷贝
- GitHub上整理的一些工具
- web系统测试之刃
- 1010. 一元多项式求导 (25)
- 诚信
- CentOS6设置Django开发环境
- 整数中1出现的次数(从1到n整数中1出现的次数)
- USACO:2.2.3 Runaround Numbers 循环数