项目中使用yaf 框架,后台希望有一个rbac权限控制,而yaf没有这个功能,只能自己写一个

RBAC

基本概念就不说了,基本大家要是知道的都知道,不知道的就去深入了解一下吧

简单画了一个关系图,大体rbac关系如上图,当然表里面的字段还是可以变化,比如我这次实际上就只用三张表,仔细看的话,角色表和节点表其实是可以成为一张表,用户-角色表角色-节点表也可以成为一张表,这样不过代码逻辑要多处理一下

YAF RABC 基类

这个是处理rbac 的关键类,只有这个写好了,rbac 才能处理正确。主要有一下几个方法:

  • 是否是超级管理员(如果是超级管理员的话就没必要验证),伪代码:

 public static function isSuperAdmin(int $user_id){

   return $user_id==const::SUPERADMIN;

}
  • 验证权限,伪代码:

public static function Auth(int $user_id){

  //是不是超级管理员
  if(self::isSuperAdmin($user_id)) return true;
    
   //获取用户的权限
  if(!$accessList=self::getAccessList($user_id)) return false;

   //获取yaf 的当前请求控制器和方法
    $request    = \Yaf_Dispatcher::getInstance()->getRequest();
    $controller = $request->getControllerName();
    $action     = $request->getActionName();

     return isset($accessList[$controller]) && in_array($action, $accessList[strtolower($controller)]);

}
  • 获取用户权限列表,伪代码:

  static function getAccessList(int $user_id){

if (!$admin = AdminModel::select('id')->find($user_id))
            return false;

        $controllers = [];
        $actions     = [];
        foreach ($admin->roles as $v)
        {
            foreach ($v->access as $val)
            {
                $val->pid ? $actions[$val->pid][] = strtolower($val->name) : $controllers[] = $val;
            }
        }

        $accessList = [];
        foreach ($controllers as $v)
        {
            $a = isset($actions[$v->id]) ? array_unique($actions[$v->id]) : [];
            $c = strtolower($v->name);
            $accessList[$c] = isset($accessList[$c]) ? $accessList[$c] + $a : $a;
        }

        self::$_accessList = $accessList;

        return $accessList;

}

大体rbac 也就那么一点东西,然后在控制器的基类中的__construct中加入Rbac::Auth($user_id)就可以实现

当然后面还会针对于不同的用户,能看到不同的后台权限板块,以前针对于rbac 下的面包屑导航等等,有空下次在写

good luck


soledad
888 声望35 粉丝

我们努力的付出想换来的是什么,我只想让自己过得快乐点


引用和评论

0 条评论