项目中使用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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。