国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一個簡易高效的Laravel的ACL權限系統實現思路

mayaohua / 2107人閱讀

摘要:一個簡易高效的權限設計系統的實現思路要在上設計一個權限系統,調研了一下等相關權限包,發現效率太低,對于每一次都需要進行連表查詢,對于一個控制臺菜單來說量居然上了,這是不能忍受的。干脆自己做一套簡易的權限結構。

一個簡易高效的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

相關文章

  • PHP -Casbin: 支持 ACL、RBAC、ABAC 多種模型 PHP 權限管理框架

    摘要:是一個用語言打造的輕量級開源訪問控制框架,目前在開源。采用了元模型的設計思想,支持多種經典的訪問控制方案,如基于角色的訪問控制基于屬性的訪問控制等。 showImg(https://segmentfault.com/img/bVbkDJf?w=500&h=220); PHP-Casbin 是一個用 PHP 語言打造的輕量級開源訪問控制框架( https://github.com/php...

    rainyang 評論0 收藏0
  • laravel5.1 -- ACL(Access Control List) Policies篇

    摘要:在中,提供了管理授權邏輯以便控制對資源的訪問權限。例如,我們可以利用來確定當前的是否有修改一篇文章的權限。 Introduction 在laravel中,Policies提供了管理授權邏輯以便控制對資源的訪問權限。例如,我們可以利用poslicies來確定當前的user是否有修改一篇文章的權限。 生成一個PostPolicy $ php artisan make:policy Pos...

    instein 評論0 收藏0
  • Any-基于Laravel5.4新權限管理后臺骨架

    摘要:最簡化權限管理系統,基于開發。基于開發,唯一優化的是用權限和路由別名綁定,這樣代碼寫好之后就可以直接使用。如果是超級管理員,即使沒有這個權限會自動賦予權限給超級管理員角色。默認管理員賬號密碼。然后正常執行命令其他命令即可。 Any 最簡化權限管理系統,基于 Laravel5.4 開發。由于 Laravel5.5 發布推遲,只好先寫個 Laravel5.4版本的,后面再升級上去。演示地址...

    Lavender 評論0 收藏0
  • Laravel 工具包推薦--角色/權限管理】

    摘要:在大多數的開發中,角色和權限的管理都是非常重要的一部分。上關于角色和權限管理的包有很多,今天就為大家介紹幾個好用的包。緩存在中,為了提高應用的性能,或自動的存儲角色和權限數據。 showImg(https://segmentfault.com/img/bVTEb3?w=2200&h=1125); 在大多數的web開發中,角色和權限的管理都是非常重要的一部分。Laravel上關于角色和權...

    xiaoxiaozi 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<