摘要:一個簡易高效的權限設計系統的實現思路要在上設計一個權限系統,調研了一下等相關權限包,發現效率太低,對于每一次都需要進行連表查詢,對于一個控制臺菜單來說量居然上了,這是不能忍受的。干脆自己做一套簡易的權限結構。
一個簡易高效的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 ]
利用這三個思路實現的權限系統簡潔、高效,緩存權限之后,基本不會查表即可實現批量權限判斷,大大改善了之前權限系統的性能問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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上關于角色和權...
閱讀 2577·2021-10-25 09:45
閱讀 1239·2021-10-14 09:43
閱讀 2297·2021-09-22 15:23
閱讀 1519·2021-09-22 14:58
閱讀 1934·2019-08-30 15:54
閱讀 3539·2019-08-30 13:00
閱讀 1354·2019-08-29 18:44
閱讀 1571·2019-08-29 16:59