您好,登錄后才能下訂單哦!
使用Laravel怎么實現(xiàn)一個用戶授權(quán)系統(tǒng)?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
首先兩個概念分清楚:
用戶身份認證 Authentication - 處理用戶登錄, 退出, 注冊, 找回密碼, 重置密碼, 用戶郵箱認證 etc..
權(quán)限管理 Authorization - 負責(zé) 用戶 與 權(quán)限, 用戶組 三者之間的對應(yīng), 以及管理.
下面話不多說了,來一起看看詳細的介紹吧
基本用法
示例
$this->authorize('update', $post);
第一個參數(shù) $ability,表示具備什么權(quán)限。第二個參數(shù) $post,是一個模型實例。
不需指定模型的動作,比如 create,不需要指定的模型。第二個參數(shù)傳一個類名。如:
$this->authorize('create', Post::class);
使用的場景有:控制器輔助方法,中間件,Blade模板,User 模型的 can 和 can't 方法。
authorize方法:
public function authorize($ability, $arguments = []) { list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments); return app(Gate::class)->authorize($ability, $arguments); }
有兩種方式實現(xiàn)用戶授權(quán)
Gates
編寫 Gates
一般在 app\Providers\AuthServiceProvider 的 boot 方法中定義。
Gate::define('update-post', function ($user, $post) { return $user->id == $post->user_id; });
第一個參數(shù)是權(quán)限的名稱,第二個參數(shù)是滿足權(quán)限的條件,可以是閉包,控制器方法。
授權(quán)動作
allows 和 denies 兩種方法,表示允許和否定。
第一個參數(shù)是權(quán)限的名稱,第二個參數(shù)是模型,可以為空。這里不需要傳入用戶,框架會自動處理。
if (Gate::allows('update-post', $post)) { // 指定用戶可以更新博客... } if (Gate::denies('update-post', $post)) { // 指定用戶不能更新博客... }
如果需要指定特定用戶,可以使用 Gate Facade 中的 forUser 方法:
if (Gate::forUser($user)->allows('update-post', $post)) { // 指定用戶可以更新博客... } if (Gate::forUser($user)->denies('update-post', $post)) { // 指定用戶不能更新博客... }
策略
生成策略
artisan 命令:
php artisan make:policy PostPolicy
也可以指定 model,生成包含 CURD 的策略方法。
注冊策略
在 AuthServiceProvider 的 policies 屬性,可以將模型和策略對應(yīng)起來。如:
protected $policies = [ Post::class => PostPolicy::class, ];
策略方法
public function update(User $user, Post $post) { return $user->id === $post->user_id; }
策略方法,就是權(quán)限名稱,$this->authorize(‘update', $post)
的第一個參數(shù)就對應(yīng)同名的策略方法,第二個參數(shù) $post 代表它是一個 Post 模型,框架會根據(jù)參數(shù)判斷采用 Post::class => PostPolicy::class
這個策略。
當 authorize 方法調(diào)用的時候,實際上會自動注入 User 和 Post 類型的兩個參數(shù),也因此使用授權(quán)系統(tǒng)必須是用戶登錄的情況下。
使用策略也不一定要和模型綁定,比如這樣也可以:
protected $policies = [ Travel::class => TravelPolicy::class, 'aaa'=>TravelPolicy::class, ];
這個 aaa 字符串對應(yīng)策略類為 TravelPolicy::class
,在控制器使用 authorize 判斷授權(quán):
$this->authorize('update','aaa');
此時也是可行的,第二個參數(shù)這個時候就必須是字符串 aaa 了,然后 authorize 方法只會自動注入 User 參數(shù)。
關(guān)于使用Laravel怎么實現(xiàn)一個用戶授權(quán)系統(tǒng)問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。