成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

laravel實(shí)現(xiàn)簡(jiǎn)單用戶權(quán)限

goji / 3300人閱讀

摘要:設(shè)計(jì)判斷是否有某個(gè)權(quán)限是一個(gè)二維數(shù)組全局設(shè)置在數(shù)據(jù)庫中,我將二維數(shù)組存儲(chǔ)為,利用的的和方法,完成了數(shù)據(jù)庫中和外界程序邏輯的連接。

關(guān)于權(quán)限管理的思考
最近用laravel設(shè)計(jì)后臺(tái),后臺(tái)需要有個(gè)權(quán)限管理。權(quán)限管理實(shí)質(zhì)上分為兩個(gè)部分,首先是認(rèn)證,然后是權(quán)限。認(rèn)證部分非常好做,就是管理員登錄,記錄session。這個(gè)laravel中也有自帶Auth來實(shí)現(xiàn)這個(gè)。最麻煩就是權(quán)限認(rèn)證。

權(quán)限認(rèn)證本質(zhì)上就是誰有權(quán)限管理什么東西。這里有兩個(gè)方面的維度,誰,就是用戶維度,在用戶維度,權(quán)限管理的粒度可以是用戶一個(gè)人,也可以是將用戶分組,如果將用戶分組,則涉及到的邏輯是一個(gè)用戶可以在多個(gè)組里面嗎?在另外一方面,管理什么東西,這個(gè)東西是物的維度,一個(gè)頁面是一個(gè)東西,一個(gè)頁面上的一個(gè)元素也是一個(gè)東西,或者往大了說,一個(gè)功能是一個(gè)東西。所以做權(quán)限管理最重要的是確認(rèn)這兩個(gè)維度的粒度。這個(gè)已經(jīng)不是技術(shù)的事情了,這個(gè)是需要需求討論的了。

基于上面的思考,我這次想做的權(quán)限管理,在用戶維度,是基于個(gè)人的。就是每個(gè)人的權(quán)限不一樣。在東西的維度,我設(shè)置路由為最小的單位,即可以為單個(gè)路由設(shè)置權(quán)限管理。

下面的思考就是使用什么來標(biāo)記權(quán)限,可以使用位,也可以使用字符,也可以使用整型。后來我選擇了字符,基于兩點(diǎn)考慮:1 字符淺顯易懂,在數(shù)據(jù)庫中查找也比較方便 2 我沒有按照某個(gè)權(quán)限查找有這個(gè)權(quán)限的人的需求,即沒有反查需求,使用位,整型等都意義不大。

接下來考慮如何和laravel結(jié)合,既然要為每個(gè)路由設(shè)置訪問權(quán)限,那么我當(dāng)然希望能在laravel的route.php路由管理中配置。最好就是在Route::get的時(shí)候有個(gè)參數(shù)能設(shè)置permission。這樣做的好處是權(quán)限設(shè)置簡(jiǎn)易了。在決定路由的時(shí)候,就順手寫了權(quán)限控制。壞處呢,也很明顯,laravel路由的三種方式只能寫一種了。就是Route::(method)這樣的方式了。

基本決定好了就開干。

路由設(shè)計(jì)
基本的路由是這樣的

Route::post("/admin/validate", ["uses" => "AdminController@postValidate", "permissions"=>["admin.validate", "admin.index"]]);
這里在基本的制定路由action之后設(shè)置了一個(gè)permissions的屬性,這個(gè)屬性設(shè)計(jì)成數(shù)組,因?yàn)楸热缫粋€(gè)post請(qǐng)求,它可能在某個(gè)頁面會(huì)觸發(fā),也可能在另外一個(gè)頁面觸發(fā),那么這個(gè)post請(qǐng)求就需要同時(shí)擁有兩個(gè)頁面路由的權(quán)限。

這里使用admin.validate的權(quán)限控制,這樣,可以將權(quán)限分組,admin都是關(guān)于admin相關(guān)的分組,在數(shù)據(jù)庫中,我就會(huì)存儲(chǔ)一個(gè)二維數(shù)組,[admin] => ["validate", "index"]; 存儲(chǔ)成二維數(shù)組而不是一維的好處呢,一般后臺(tái)展示是有兩個(gè)維度的,一個(gè)是頭部的tab欄,一個(gè)是左邊的nav欄,就是說這個(gè)二維的數(shù)組和后臺(tái)的tab,nav欄是一一對(duì)應(yīng)的。

中間件設(shè)計(jì)
好了,下面我們就掛上中間件,并且設(shè)置所有的路由都走這個(gè)中間件

getPermission($request);

        $admin = AppHttpMiddlewareAuthenticate::getAuthUser();

        // 只要有一個(gè)有權(quán)限,就可以進(jìn)入這個(gè)請(qǐng)求
        foreach ($permits as $permit) {
            if ($permit == "*") {
                return $next($request);
            }
            if ($admin->hasPermission($permit)) {
                return $next($request);
            }
        }

        echo "沒有權(quán)限,請(qǐng)聯(lián)系管理員";exit;
    }

    // 獲取當(dāng)前路由需要的權(quán)限
    public  function getPermission($request)
    {
        $actions = $request->route()->getAction();
        if (empty($actions["permissions"])) {
            echo "路由沒有設(shè)置權(quán)限";exit;
        }
        return $actions["permissions"];
    }
}

這里最關(guān)鍵的就getPermission函數(shù),從$request->route()->getAction()來獲取出這個(gè)路由的action定義,然后從其中的permissions字段中獲取route.php中定義的路由權(quán)限。

然后上面的middleware有個(gè)admin?>hasPermission(permit); 這個(gè)就涉及到model的設(shè)計(jì)。

model設(shè)計(jì)

permissions;
        if(in_array($permission, $permission_db)) {
            return true;
        }

        return false;
    }

    // permission 是一個(gè)二維數(shù)組
    public function getPermissionsAttribute($value)
    {
        if (empty($value)) {
            return [];
        }
        $data = json_decode($value, true);
        $ret = [];
        foreach ($data as $key => $value) {
            $ret[] = $key;
            foreach ($value as $value2) {
                $ret[] = "{$key}.{$value2}";
            }
        }
        return array_unique($ret);
    }

    // 全局設(shè)置permission
    public function setPermissionsAttribute($value)
    {
        $ret = [];
        foreach ($value as $item) {
            $keys = explode(".", $item);
            if (count($keys) != 2) {
                continue;
            }
            $ret[$keys[0]][] = $keys[1];
        }

        $this->attributes["permissions"] = json_encode($ret);
    }
}

在數(shù)據(jù)庫中,我將二維數(shù)組存儲(chǔ)為json,利用laravel的Attribute的get和set方法,完成了數(shù)據(jù)庫中json和外界程序邏輯的連接。然后hasPermission就顯得很輕松了,直接判斷in_array就ok了。

后續(xù)
這個(gè)權(quán)限認(rèn)證的邏輯就清晰了。然后如果頁面中某個(gè)tab或者nav需要對(duì)不同權(quán)限的用戶展示,只需要在view中判斷

@if ($admin->hasPermission("admin.index")) 
@endif

就可以判斷這個(gè)用戶是否可以看到這個(gè)tab了。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31598.html

相關(guān)文章

  • Any-基于Laravel5.4新的權(quán)限管理后臺(tái)骨架

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

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

    摘要:在大多數(shù)的開發(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開發(fā)中,角色和權(quán)限的管理都是非常重要的一部分。Laravel上關(guān)于角色和權(quán)...

    xiaoxiaozi 評(píng)論0 收藏0
  • 10 個(gè)優(yōu)質(zhì)的 Laravel 擴(kuò)展推薦

    摘要:優(yōu)點(diǎn)使用簡(jiǎn)單服務(wù)自定義數(shù)據(jù)庫查詢生成多重定制哪里獲取表單構(gòu)造器說實(shí)話,我不喜歡在中混合表單。表單構(gòu)造器能夠讓你的表單從視圖中分離出去。功能多數(shù)據(jù)庫多域名和子域名自動(dòng)生成或者配置文件支持隊(duì)列支持文件分開存儲(chǔ)。 showImg(https://segmentfault.com/img/remote/1460000015090896); 這里有 10+ 個(gè)用來搭建 Laravel 應(yīng)用的包 ...

    simon_chen 評(píng)論0 收藏0
  • Laravel Policy 使用

    摘要:提供更簡(jiǎn)單的方式來處理用戶授權(quán)動(dòng)作。類似用戶認(rèn)證,有種主要方式來實(shí)現(xiàn)用戶授權(quán)和策略,我這里主要講解下策略的使用。文檔上面有詳細(xì)的說明,我這里只根據(jù)自己使用過程做一個(gè)簡(jiǎn)單的筆記。 Laravel 提供更簡(jiǎn)單的方式來處理用戶授權(quán)動(dòng)作。類似用戶認(rèn)證,有 2 種主要方式來實(shí)現(xiàn)用戶授權(quán):gates 和策略,我這里主要講解下策略的使用。 文檔 上面有詳細(xì)的說明,我這里只根據(jù)自己使用過程做一個(gè)簡(jiǎn)單的...

    曹金海 評(píng)論0 收藏0
  • PHP / Laravel API 開發(fā)推薦閱讀清單

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開發(fā) API 實(shí)戰(zhàn),讓 API 開發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項(xiàng)目中使用 - API 文檔撰寫方案 推薦 Laravel API 項(xiàng)目必須使用的 8 個(gè)...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<