成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

一個(gè)簡(jiǎn)易高效的Laravel的ACL權(quán)限系統(tǒng)實(shí)現(xiàn)思路

mayaohua / 2165人閱讀

摘要:一個(gè)簡(jiǎn)易高效的權(quán)限設(shè)計(jì)系統(tǒng)的實(shí)現(xiàn)思路要在上設(shè)計(jì)一個(gè)權(quán)限系統(tǒng),調(diào)研了一下等相關(guān)權(quán)限包,發(fā)現(xiàn)效率太低,對(duì)于每一次都需要進(jìn)行連表查詢(xún),對(duì)于一個(gè)控制臺(tái)菜單來(lái)說(shuō)量居然上了,這是不能忍受的。干脆自己做一套簡(jiǎn)易的權(quán)限結(jié)構(gòu)。

一個(gè)簡(jiǎn)易高效的ACL權(quán)限設(shè)計(jì)系統(tǒng)的實(shí)現(xiàn)思路

要在laravel上設(shè)計(jì)一個(gè)acl權(quán)限系統(tǒng),調(diào)研了一下Entrust等相關(guān)權(quán)限包,發(fā)現(xiàn)效率太低,對(duì)于每一次QueryPrmission、QueryRole都需要進(jìn)行連表查詢(xún),對(duì)于一個(gè)控制臺(tái)菜單來(lái)說(shuō)sql量居然上了50+,這是不能忍受的。

干脆自己做一套簡(jiǎn)易的user-role-permission權(quán)限結(jié)構(gòu)。

思路:

緩存用戶(hù)權(quán)限

批量判斷權(quán)限

實(shí)現(xiàn)權(quán)限攔截中間件

緩存權(quán)限

一般來(lái)說(shuō),除更改用戶(hù)權(quán)限邏輯代碼,其他時(shí)候用戶(hù)的權(quán)限是不變的,所以可以緩存用戶(hù)所有的角色和權(quán)限信息。

同時(shí)為了提供刷新用戶(hù)權(quán)限的行為,添加了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;
        });
    }
}
批量判斷權(quán)限的思路

對(duì)于批量判斷權(quán)限時(shí)候,需要有方法批量返回判斷數(shù)組。這里借鑒了Entrust的getAbility思路。

/**
 * @param $pers []
 * @param $option [] valid_all 是否判斷全部權(quán)限 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;
    }
}
路由攔截中間件

批量判斷權(quán)限高效實(shí)現(xiàn)了頁(yè)面渲染時(shí)候權(quán)限判斷問(wèn)題,為了進(jìn)一步增強(qiáng)系統(tǒng)安全性,需要對(duì)路由進(jìn)行權(quán)限匹配攔截。

這里就不貼代碼了,主要的意思是對(duì)route group內(nèi)每一次的請(qǐng)求進(jìn)行權(quán)限檢查,這里需要注意有些請(qǐng)求含有參數(shù),所以需要路徑通配符判斷,其次需要對(duì)路由方法進(jìn)行檢測(cè)。攔截規(guī)則類(lèi)似于:

$rules = [
    "/admin/post/{id}" => ["method" => "DELETE" , "permission" => "post_delete"],
    "/admin/post/{id}/edit" => "post_edit", //default any http method
]

利用這三個(gè)思路實(shí)現(xiàn)的權(quán)限系統(tǒng)簡(jiǎn)潔、高效,緩存權(quán)限之后,基本不會(huì)查表即可實(shí)現(xiàn)批量權(quán)限判斷,大大改善了之前權(quán)限系統(tǒng)的性能問(wèn)題。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/22394.html

相關(guān)文章

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

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

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

    摘要:在中,提供了管理授權(quán)邏輯以便控制對(duì)資源的訪(fǎng)問(wèn)權(quán)限。例如,我們可以利用來(lái)確定當(dāng)前的是否有修改一篇文章的權(quán)限。 Introduction 在laravel中,Policies提供了管理授權(quán)邏輯以便控制對(duì)資源的訪(fǎng)問(wèn)權(quán)限。例如,我們可以利用poslicies來(lái)確定當(dāng)前的user是否有修改一篇文章的權(quán)限。 生成一個(gè)PostPolicy $ php artisan make:policy Pos...

    instein 評(píng)論0 收藏0
  • Any-基于Laravel5.4新權(quán)限管理后臺(tái)骨架

    摘要:最簡(jiǎn)化權(quán)限管理系統(tǒng),基于開(kāi)發(fā)?;陂_(kāi)發(fā),唯一優(yōu)化的是用權(quán)限和路由別名綁定,這樣代碼寫(xiě)好之后就可以直接使用。如果是超級(jí)管理員,即使沒(méi)有這個(gè)權(quán)限會(huì)自動(dòng)賦予權(quán)限給超級(jí)管理員角色。默認(rèn)管理員賬號(hào)密碼。然后正常執(zhí)行命令其他命令即可。 Any 最簡(jiǎn)化權(quán)限管理系統(tǒng),基于 Laravel5.4 開(kāi)發(fā)。由于 Laravel5.5 發(fā)布推遲,只好先寫(xiě)個(gè) Laravel5.4版本的,后面再升級(jí)上去。演示地址...

    Lavender 評(píng)論0 收藏0
  • Laravel 工具包推薦--角色/權(quán)限管理】

    摘要:在大多數(shù)的開(kāi)發(fā)中,角色和權(quán)限的管理都是非常重要的一部分。上關(guān)于角色和權(quán)限管理的包有很多,今天就為大家介紹幾個(gè)好用的包。緩存在中,為了提高應(yīng)用的性能,或自動(dòng)的存儲(chǔ)角色和權(quán)限數(shù)據(jù)。 showImg(https://segmentfault.com/img/bVTEb3?w=2200&h=1125); 在大多數(shù)的web開(kāi)發(fā)中,角色和權(quán)限的管理都是非常重要的一部分。Laravel上關(guān)于角色和權(quán)...

    xiaoxiaozi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<