防跳墙访问

出现场景:

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

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

解决方案:

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

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

20180305223721388.png

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

具体实施:

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

<?php
namespace Home\Controller;
use Think\Controller;
class CommonController extends Controller {
   Public function _initialize(){
          // 初始化的时候检查用户权限
      if(!isset($_SESSION['username']) || $_SESSION['username']==''){
         $this->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

具体实施:

<?php
namespace Home\Controller;
use Think\Controller;

class CommonController extends Controller{
    function _initialize(){
        //检测session
        if(!session('?id')){
            $this->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

<table >
    <thead>
        <tr>
            <th>
                <input name="" type="checkbox" value="" id="checkAll" />
            </th>
            <th>编号</th>
            <th>角色名</th>
            <th>权限ids</th>
            <th>权限路径</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
       <foreach name="role_list" item="vo">
        <tr>
            <td>
                <input name="" type="checkbox" value="" />
            </td>
            <td>{$vo.role_id}</td>
            <td>{$vo.role_name}</td>
            <td>{$vo.role_auth_ids}</td>
            <td>{$vo.role_auth_path}</td>
            <td>
               <a href="{:U('distribute', 'role_id='.$vo[role_id])}" class="tablelink">分配权限</a> 
               <a href="#" class="tablelink"> 删除</a>
            </td>
        </tr>
        </foreach>
    </tbody>
</table>

权限列表 distribute.html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    <script language="JavaScript" src="__ADMIN__/js/jquery.js"></script>
</head>

<body>
    <div>
        <form action="" method="post">
           <input type="hidden" name="role_id" value="{$Think.get.role_id}" />
                您正在给【<label style="color: red;font-weight: bolder;">{$role_info.role_name}</label>】设置权限
            <ul>
                <table>
                    <thead>
                        <tr>
                            <th>权限分类</th>
                            <th>权限</th>
                        </tr>
                    </thead>
                    <tbody>
                        <foreach name="auth_p" item="vo">
                        <tr>
                            <td>
                                <in name="vo.auth_id" value="$role_info.role_auth_ids">
                                <input type="checkbox" name="auth_id[]" value="{$vo.auth_id}" checked="checked" />
                                <else />
                                <input type="checkbox" name="auth_id[]" value="{$vo.auth_id}" />
                                </in>
                                {$vo.auth_name}
                            </td>
                            <td>
                                <foreach name="auth_s" item="v">
                                    <if condition="$v.auth_pid eq $vo.auth_id ">
                                    <input type="checkbox" name="auth_id[]" value="{$v.auth_id}"
                                        <in name="v.auth_id" value="$role_info.role_auth_ids">checked="checked"</in>
                                    >{$v.auth_name}&emsp;
                                    </if>
                                </foreach>
                            </td>
                        </tr>
                        </foreach>
                    </tbody>
                </table>
                <br/>
                <li>
                    <label>&nbsp;</label>
                    <input name="" id="btnSubmit" type="button" class="btn" value="确认保存" />
                </li>
            </ul>
        </form>
    </div>
</body>

<script type="text/javascript">
$(function(){
    //给btnsubmit绑定点击事件
    $('#btnSubmit').on('click',function(){
        //表单提交
        $('form').submit();
    })
});
</script>
</html>

php部分: 对应的方法:

<?php
function distribute(){
    $role_model = D('Role');
    if(IS_POST){
        //1. 接收role_id的值
        $role_id = I('post.role_id');
        //1. 接收表单数据
        $ids = I('post.auth_id');
        //dump($ids);
        //2. 将数组转为字符串
        $ids = implode(',', $ids);

        //3. 根据ids从auth表中查询数据,拼接role_auth_path需要数据
        $auth_list = D('Auth')->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();
    }

}
 ?>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容