摘要:一个简易高效的权限设计系统的实现思路要在上设计一个权限系统,调研了一下等相关权限包,发现效率太低,对于每一次都需要进行连表查询,对于一个控制台菜单来说量居然上了,这是不能忍受的。干脆自己做一套简易的权限结构。
一个简易高效的ACL权限设计系统的实现思路
要在laravel上设计一个acl权限系统,调研了一下Entrust等相关权限包,发现效率太低,对于每一次QueryPrmission、QueryRole都需要进行连表查询,对于一个控制台菜单来说sql量居然上了50+,这是不能忍受的。
干脆自己做一套简易的user-role-permission权限结构。
思路:
缓存用户权限
批量判断权限
实现权限拦截中间件
缓存权限一般来说,除更改用户权限逻辑代码,其他时候用户的权限是不变的,所以可以缓存用户所有的角色和权限信息。
同时为了提供刷新用户权限的行为,添加了flush permission的功能。
</>复制代码
function cacheUserRolesAndPermissions($user_id , $flash = false){
if ($flash){
Cache::forget("user_r_p_" . $user_id);
return cacheUserRolesAndPermissions($user_id , false);
}else{
return Cache::remember("user_r_p_" . $user_id , 60 ,function() use($user_id){
$res = collect(DB::table("role_user")
->where("role_user.user_id" , $user_id)
->join("roles" , "roles.id" , "=" , "role_user.role_id")
->join("permission_role" , "permission_role.role_id" , "=" ,"role_user.role_id")
->join("permissions" , "permissions.id" , "=" , "permission_role.permission_id")
->select(["permissions.name as p_name" , "roles.name as r_name"])
->get());
$roles = $res->pluck("r_name")->unique();
$pers = $res->pluck("p_name")->unique();
$vals = [
"roles" => $roles->values()->all(),
"pers" => $pers->values()->all()
];
return $vals;
});
}
}
批量判断权限的思路
对于批量判断权限时候,需要有方法批量返回判断数组。这里借鉴了Entrust的getAbility思路。
</>复制代码
/**
* @param $pers []
* @param $option [] valid_all 是否判断全部权限 return_type boolean/array
*/
function hasPermission($pers , $option = []){
$option = array_merge(["valid_all" => false , "return_type" => "boolean"] , $option); //return_type boolean|array|both
if (!is_array($pers)) $pers = [$pers];
$gates = cacheUserRolesAndPermissions(Auth::id());
if ($option["return_type"] == "boolean"){
foreach ($pers as $per){
if (in_array($per , $gates["pers"])){
if (!$option["valid_all"]){
return true;
}
}else{
if ($option["valid_all"]){
return false;
}
}
}
if ($option["valid_all"]) return true;
else return false;
}else if ($option["return_type"] == "array"){
$res = [];
foreach ($pers as $per){
$res[$per] = in_array($per , $gates["pers"]);
}
return $res;
}else{
return null;
}
}
路由拦截中间件
批量判断权限高效实现了页面渲染时候权限判断问题,为了进一步增强系统安全性,需要对路由进行权限匹配拦截。
这里就不贴代码了,主要的意思是对route group内每一次的请求进行权限检查,这里需要注意有些请求含有参数,所以需要路径通配符判断,其次需要对路由方法进行检测。拦截规则类似于:
</>复制代码
$rules = [
"/admin/post/{id}" => ["method" => "DELETE" , "permission" => "post_delete"],
"/admin/post/{id}/edit" => "post_edit", //default any http method
]
利用这三个思路实现的权限系统简洁、高效,缓存权限之后,基本不会查表即可实现批量权限判断,大大改善了之前权限系统的性能问题。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/22394.html
摘要:是一个用语言打造的轻量级开源访问控制框架,目前在开源。采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制基于属性的访问控制等。 showImg(https://segmentfault.com/img/bVbkDJf?w=500&h=220); PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架( https://github.com/php...
摘要:在中,提供了管理授权逻辑以便控制对资源的访问权限。例如,我们可以利用来确定当前的是否有修改一篇文章的权限。 Introduction 在laravel中,Policies提供了管理授权逻辑以便控制对资源的访问权限。例如,我们可以利用poslicies来确定当前的user是否有修改一篇文章的权限。 生成一个PostPolicy $ php artisan make:policy Pos...
摘要:最简化权限管理系统,基于开发。基于开发,唯一优化的是用权限和路由别名绑定,这样代码写好之后就可以直接使用。如果是超级管理员,即使没有这个权限会自动赋予权限给超级管理员角色。默认管理员账号密码。然后正常执行命令其他命令即可。 Any 最简化权限管理系统,基于 Laravel5.4 开发。由于 Laravel5.5 发布推迟,只好先写个 Laravel5.4版本的,后面再升级上去。演示地址...
摘要:在大多数的开发中,角色和权限的管理都是非常重要的一部分。上关于角色和权限管理的包有很多,今天就为大家介绍几个好用的包。缓存在中,为了提高应用的性能,或自动的存储角色和权限数据。 showImg(https://segmentfault.com/img/bVTEb3?w=2200&h=1125); 在大多数的web开发中,角色和权限的管理都是非常重要的一部分。Laravel上关于角色和权...
阅读 2688·2021-10-25 09:45
阅读 1328·2021-10-14 09:43
阅读 2404·2021-09-22 15:23
阅读 1651·2021-09-22 14:58
阅读 2014·2019-08-30 15:54
阅读 3622·2019-08-30 13:00
阅读 1445·2019-08-29 18:44
阅读 1647·2019-08-29 16:59
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要