RBAC权限控制
1、建表:用户表 角色表 权限表 根据关系分析出另外两张关系表 这是最基本的五张表 只要是RBAC一般都是五张表注:权限表的p_path字段代表的是父级权限id,可以这么说:当前记录的p_path就是父级记录的p_id
2、初始化好表数据,例如用户信息,角色信息,基本的权限信息
3、搭建tp框架,首先做登录(防非法登录,即存session的问题,引入第三方类判断session)
4、登录完成后可以获取到刚登陆的用户的id,根据用户id查询出对应的权限菜单,SQL如下:
select power.p_id,p_name,method,p_path from u_r inner join r_p on u_r.r_id=r_p.r_id inner join power on power.p_id=r_p.p_id where u_r.u_id=".登陆后的用户id
5、查询后的结果是一个无序的二维数组,此时需要调用递归函数,处理成有序的菜单,代码如下:
解释:$data为第四步sql返回的结果,$path代表从第一级开始找,$flage用来标志是第几级权限public function digui($data,$path=0,$flage=0){static $arr=array();foreach($data as $key=>$val){if($val['p_path']==$path){$val['flage']=$flage;$arr[]=$val;$this->digui($data,$val['p_id'],$flage+1);}}return $arr;}再将递归后的数组转换成一维数组,存入session//处理成一维数组放入session中for($i=0;$i
-
{$val.p_name}
- {$val.p_name}
7、创建公共类,即为Common类,作用是继承Controller类,和Index类一样,非Index类继承Common类,这里边写上判断时候登录和是否有权限的代码:public function __construct(){parent::__construct();//获取当前URL请求的控制器名字$controller=CONTROLLER_NAME;//获取当前URL请求的方法名$action=ACTION_NAME;//取出session中的权限$power=session("power");//取出session中的登录姓名$name=session("name");if(!empty($name)){//判断请求的地址,是不是他的权限if(!in_array($controller."/".$action,$power)){$this->error("对不起,没有权限!");die;}}else{$this->success("请先登录!",U("Index/index"));die;}}8、自己手动再创建几个类,都要继承Common类,然后通过更改URL地址栏来测试,权限控制是否成功!
8.简单的子查询:select DISTINCT quan.* from quan where quan_id in(select quan_id from
r_q where role_id in(select role_id from u_r where user_id=$user_id))";
9、根据要求,继续完成你的业务 思想很重要