ThinkPHP3.2.3 RBAC根据权限进行操作显示

前面已经做了数据库的操作。
http://www.fungj.com/information/rbac-thinkphp323-foundation-to-establish-database-permissions.html
然后就是要根据不同的权限,对后台的相关菜单进行显示。

这个操作主要有以下几个步骤:

1、用户登录系统显示权限信息 $_SESSION['userid']
2、根据session信息获得角色role_id信息
3、根据角色id信息获得权限列表ids信息
4、根据权限ids信息查询具体权限信息进而显示

我学习的后台是个品字形框架,所以我的菜单是在左边。顺带就有个方法和视图了
left和left.html
先看方法left

//后台左边页面
public function left() {
    $sql = "select * from manager where mg_id=".$_SESSION['userid'];
    $minfo = M()->query($sql);
    $role_id = $minfo[0]['mg_role_id'];
    //根据角色信息获得权限ids的信息
    $sql = "select * from role where role_id=".$role_id;
    $rinfo = M()->query($sql);
    $auth_ids = $rinfo[0]['role_auth_ids'];
    //根据$auth_ids查询全部拥有的权限信息
    //① 获得顶级权限
    $sql = "select * from auth where auth_level=0 ";
    //如果是admin管理员要现实全部权限
    if($_SESSION['userid'] != 1){
        $sql .= " and auth_id in ($auth_ids)";
    }
    $p_info = M()->query($sql);
    //② 获得次顶级权限
    $sql = "select * from auth where auth_level=1";
    //如果是admin管理员要现实全部权限
    if($_SESSION['userid'] != 1){
        $sql .= " and auth_id in ($auth_ids)";
   }
    $s_info = M()->query($sql);
    //输出模板
    $this -> assign('pauth_info',$p_info);
    $this -> assign('sauth_info',$s_info);
    $this -> display();
}

其实代码还是很好看的,就是根据SESSION里面的用户ID来一层一层的获取相关信息,到最后得到auth_ids。

但最复杂的应该是判断是否是管理员权限了,特别是.= 来连接上面的SQL语句。

但这个判断里面最崩溃的还是模板部分,TP的模板标签简直是无敌了。
先看代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv=content-type content="text/html; charset=utf-8" />
  <link href="__PUBLIC__/Admin/css/admin.css" type="text/css" rel="stylesheet" />
  <script language=javascript>
            function expand(el)
            {
                childobj = document.getElementById("child" + el);

                if (childobj.style.display == 'none')
                {
                    childobj.style.display = 'block';
                }
                else
                {
                    childobj.style.display = 'none';
                }
                return;
            }
        </script>
</head>
<body>
  <table height="100%" cellspacing=0 cellpadding=0 width=170 
               background=__PUBLIC__/Admin/img/menu_bg.jpg border=0>
    <tr>
      <td valign=top align=middle>
        <table cellspacing=0 cellpadding=0 width="100%" border=0>

          <tr>
            <td height=10></td>
          </tr>
        </table>
        <foreach name="pauth_info" item="v">
          <table cellspacing=0 cellpadding=0 width=150 border=0>
            <tr height=22>
              <td style="padding-left: 30px" background=__PUBLIC__/Admin/img/menu_bt.jpg>
                <a 
                                    class=menuparent onclick=expand({$v.auth_id}) 
                                    href="javascript:void(0);">{$v.auth_name}</a>
              </td>
            </tr>
            <tr height=4>
              <td></td>
            </tr>
          </table>
          <table id=child{$v.auth_id} style="display: none" cellspacing=0 cellpadding=0 
                           width=150 border=0>
            <foreach name="sauth_info" item="sinfo">
              <eq name="sinfo.auth_pid" value="$v.auth_id">
                <tr height=20>
                  <td align=middle width=30>
                    <img height=9 
                                                           src="__PUBLIC__/Admin/img/menu_icon.gif" width=9></td>
                  <td>
                    <a class=menuchild 
                                   href="__MODULE__/{$sinfo.auth_c}/{$sinfo.auth_a}" 
                                   target="right">{$sinfo.auth_name}</a>
                  </td>
                </tr>
              </eq>
            </foreach>
          </table>
        </foreach>
      </td>
      <td width=1 bgcolor=#d1e6f7></td>
    </tr>
  </table>
</body>
</html>

这里也可以记下相关模板里面的常量,废话不说。
这里是foreach套用foreach,然后在第二个foreach里再用if判断。突然发现TP模板标签的套用居然会出问题。
特别是第二个foreach应该是用IF标签,但IF标签用了就出错,百度了下,TP可以用EQ标签代替IF标签。
注意,name="sinfo.auth_pid" value="$v.auth_id",比较的变量里面可以直接写foreach的内容,但比较直,特别是上一个foreach里的话,就要带个$。
可能这个问题,其他高手会觉得很简单,但为这个问题我被折磨了两天才搞出来。

最后修改:2016 年 09 月 29 日 02 : 25 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论