• [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>

  • 相关阅读:
    USACO Sabotage
    USACO Telephone Lines
    NOIP 2012 借教室
    洛谷 P1902 刺杀大使
    VIJOS-P1450 包裹快递
    JDOJ 1770 埃及分数
    USACO Monthly Expense
    7.modifier插件的自定义和使用
    6.function自定义插件的方法和使用
    5.Smart使用内置函数或者自定义函数
  • 原文地址:https://www.cnblogs.com/farwish/p/3886805.html
Copyright © 2020-2023  润新知