摘要:一个简易高效的权限设计系统的实现思路要在上设计一个权限系统,调研了一下等相关权限包,发现效率太低,对于每一次都需要进行连表查询,对于一个控制台菜单来说量居然上了,这是不能忍受的。干脆自己做一套简易的权限结构。
一个简易高效的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上关于角色和权...
阅读 2576·2021-10-25 09:45
阅读 1238·2021-10-14 09:43
阅读 2296·2021-09-22 15:23
阅读 1518·2021-09-22 14:58
阅读 1933·2019-08-30 15:54
阅读 3538·2019-08-30 13:00
阅读 1353·2019-08-29 18:44
阅读 1570·2019-08-29 16:59