zoukankan      html  css  js  c++  java
  • [PHP]基于角色的访问控制RBAC

    -------------------------------------------------------------------------------------------------------

    RBAC(Role Based Access Control),意为基于角色的访问控制,这里用户不再拥有单独权限,而是与角色相关联,通过赋予角色权限,那么该用户也就拥有了这个角色的权限; 这里的角色可以也理解为用户组。

    权限控制位置:在公共的控制器类的构造方法内,这样子类均需进行权限验证; 登录注册所在控制器可以不用继承,以CI框架为例:包含登录的控制器直接继承CI_Controller, 包含其他方法的控制器继承MY_Controller进行权限控制。

    自定义的RBAC类,最终返回组装的数组格式,参考如下:

    $access_list = array(
           'auth'=>array(
              'index'=>array(
                  [0]=>'index',
                  [1]=>'add',
              ),
              'user'=>array(
                  [0]=>'index',
                  [1]=>'add',
                  [2]=>'delete',
              ),
            ),
         );

    三步骤 实现RBAC =>

    一,需要的5张数据表如下:

      用户表

      角色表(用户组)

      用户和角色关联表(便于存单个用户存多个角色; 否则要在用户表存roleid,多个值)

      权限表(节点表:角色id,节点id,节点pid)

      角色与权限关联表

    (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>

  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/farwish/p/3886805.html
Copyright © 2011-2022 走看看