防跳墙访问

出现场景:

\1. 没有登录,也能访问网页

\2. 没有相关权限,也能访问对应的控制器和方法

解决方案:

定义一个CommonController,其他控制器继承CommonController,在CommonController中定义初始化方法_initialize

注:这里用的是tp3.2框架,如果我们直接在CommonController中定义__constrct构造方法,会造成重写Controller,所以我们直接使用_initialize方法(_initialize方法是tp框架的初始化方法)

防跳墙访问_第1张图片
20180305223721388.png

注:也可以parent::__construct();[tp框架中推荐用_initalize方法,如果是其他框架或是原生,可以用parent::__construct()]

具体实施:

1. 解决没有登录也可以访问网页

redirect('Login/login');
      }
   }
}
?>

核心思想: 判断是否有session

2. 解决没有相关权限,也能访问对应的控制器和方法

核心思想:

(1) 从session中获取当前访问的角色id role_id

(2) 根据role_id从role表中查询role_auth_path的值(role_auth_path记录了当前角色所有能够访问的控制器-方法字符串)

(3) 获取当前访问的控制器-方法字符串,和当前角色的role_auth_path进行比较,如果当前访问的控制器-方法在role_auth_path中,则让其正常访问, 如果不在,则说明当前角色不具有访问权限,为跳墙访问

数据表地址: http://blog.csdn.net/m_nanle_xiaobudiu/article/details/79443389

具体实施:

error('您尚未登录,请登录后再访问', U('Index/login'));
        }
        
        //获取当前访问的控制器-方法
        $now_path = CONTROLLER_NAME.'-'.ACTION_NAME;
        
        //获取session中的roleid,从role表中获取role_auth_path
        $role_id = session('role_id');
        $role_info = D('Role')->field("role_auth_path")->find($role_id);
        $role_auth_path = $role_info['role_auth_path'];

        //将 role_auth_path 转为数组
        $role_auth_path = explode(',', $role_auth_path);

        //判断$now_path是否在$role_auth_path中
        if(!in_array($now_path, $role_auth_path)){
            //如果不存在,则为跳墙访问,跳转回登录页
            $this->error('您无权访问该模块,请重新登录再访问', U('Index/login'), 3);
        }
    }
}

备注:

为角色分配权限

html部分:

角色列表页面roleList.html


        
编号 角色名 权限ids 权限路径 操作
{$vo.role_id} {$vo.role_name} {$vo.role_auth_ids} {$vo.role_auth_path} 分配权限 删除

权限列表 distribute.html



    
    无标题文档
    



    
您正在给【】设置权限
    权限分类 权限
    {$vo.auth_name} checked="checked" >{$v.auth_name} 

php部分: 对应的方法:

where("auth_id in ($ids)")->select();
        //dump($auth_list);die;
        $role_auth_path = '';
        foreach($auth_list as $value){
            if($value['auth_c'] != ''){
                $role_auth_path .= $value['auth_c'].'-'.$value['auth_a'].',';
            }
        }
        //去掉最后一个 ,
        $role_auth_path = rtrim($role_auth_path, ',');

        //4. 构造修改数据
        $save_data = array(
            'role_id' => $role_id,
            'role_auth_ids' => $ids,
            'role_auth_path' => $role_auth_path
        );

        if($role_model->save($save_data)){
            $this->success('分配权限成功', U('roleList'), 3);
        } else {
            $this->error('分配权限失败', U('roleList'), 3);
        }
    } else {
        //1.接收角色id
        $role_id = I('get.role_id');
        //2. 根据角色id查询角色信息
        $role_info = $role_model->find($role_id);
        //3. 分配到模板
        $this->assign('role_info', $role_info);

        //4. 分一二级读取auth表中的权限信息
        $auth_model = D('Auth');
        $auth_p = $auth_model->where('auth_pid=0')->select();
        $auth_s = $auth_model->where('auth_pid!=0')->select();
        $this->assign('auth_p', $auth_p);
        $this->assign('auth_s', $auth_s);

        $this->display();
    }

}
 ?>

你可能感兴趣的:(防跳墙访问)