YPHP后台中RBAC实现整理(用户篇)


上一篇: YPHP后台中RBAC实现整理(角色篇)

用户篇是这次RBAC实现整理的最后一篇,主要内容包括 用户绑定角色,后台左侧导航,用户访问节点 三部分。


用户绑定角色

这边的话就是给除超级管理员之外的用户绑定一个角色。admin表中 role_id 字段,关联 role 表。

在用户管理这块,我都是排除掉对管理员的操作的,目前要增删改超级管理员只能靠直接修改数据库了,没有做这方面的入口。


后台左侧导航

我在系统模型systemModel中写了一个生成角色导航的方法,需要2个参数,is_admin 和 role_id

1

首先得取出符合条件的节点。

基础条件: is_url = 1

当is_admin==0(非超级管理员的时候),存在附加条件。

先根据role_id去role_node表中取出与其关联的节点node_id,然后生成条件:node表中的id必须在刚取出的node_id中(in条件)

然后才是去节点表中取节点,构造节点树。

最后在拼接左侧导航的时候,我偷懒直接用2次循环了,因为我只开始设想起来,都只准备做2层导航的。

这边的class 拼上了act 和 op 是为了当访问这个节点的时候,对应导航高亮。

想提高下性能,加了缓存,所以有了前面角色管理列表中的2个删除缓存。


导航和导航高亮的代码我都是放后台的布局文件中的:

jQuery(document).ready(function($) {
        var now_class = '<?php echo "act-".$this->act."-op-".$this->op ?>';
        var li = $('.'+now_class);
        if(li.length>0){
            li.eq(0).addClass('active');
            var parents_li = li.eq(0).parents('.menu-list');
            if(parents_li.length>0){
                parents_li.eq(0).addClass('nav-active');
            }
        }
});

这边有个我还没做完,比如访问第三层节点博客管理-》文章管理-》添加文章 的时候,导航并不会高亮,我初步是想在面包屑上做文章的。。。这个影响不大,有空再说吧。


效果

2


用户访问节点

YPHP框架的设计是,当访问一个节点,找到这个控制器,一般都是继承框架基础控制器,比如 \framework\Controller .

然后有以下步骤:

1. 判断这个节点需不需要用户登录

in_array($this->op, $this->behavior())||in_array('ALL_OPTIONS',$this->behavior())

不需要则没有验证操作了,需要的话则先验证是否登录,未登录则抛出异常,登录了就继续预处理,到第2步

2. 访问$this->before() 

if(!$this->before()){
    throw new \Exception('权限不足',500);
}

behavior() 和 before() 方法可以在控制中重写。我们对该用户是否有这个节点的访问权限也就在这2个方法中去实现。

对于 behavior() 如果整个控制器中的方法都需要用户登录才能访问的话,可以用 ALL_OPTIONS 代替。

我的校验方法:

1

其实当时做到这步我就有点后悔了,我等于每个节点控制器都有写before方法,在里面调用checkUserAuth,如果我想对这个节点控制器进行权限控制的话。

我应该再建个应用基础控制器比如BaseController去继承框架基础控制器,然后具体的节点控制器再继承BaseController。这样我的before()方法就不用每个都写了,后面再改吧。


最后

整理完毕,感觉耦合度有点高,各种依赖。这就是我修修补补的结果了,欢迎讨论。


php mysql YPHP


上一篇:YPHP后台中RBAC实现整理(角色篇)

YPHP后续的开发方向(长期更):下一篇