Laravel 学习笔记: 授权策略(Policy)
Policy(即策略)是在特定模型或者資源中組織授權(quán)邏輯的類,用來處理用戶授權(quán)動(dòng)作。
比如在博客程序中會(huì)有一個(gè) Article 模型,這個(gè)模型就會(huì)有一個(gè)相應(yīng)的 ArticlePolicy 來對(duì)用戶的操作進(jìn)行授權(quán),比如在修改一篇文章時(shí),我們會(huì)這樣寫:
$article = Article::find(1) // 校驗(yàn)這篇是否屬于當(dāng)前用戶 if ($article->user_id == Auth::id()) {// 修改文章 } return ture;Policy 其實(shí)就是將校驗(yàn)的邏輯從控制器轉(zhuǎn)移到相對(duì)應(yīng)的模型策略 (ArticlePolicy) 中。
生成 Policy
使用 php artisan make:policy ArticlePolicy 命令生成 Policy,保存在 app/Policies 目錄下。
注冊(cè) Policy
然后在 app/Providers/AuthServiceProvider.php 的 policies 數(shù)組中注冊(cè)該策略,將 Article 模型與對(duì)應(yīng)的 ArticlePolicy 策略進(jìn)行綁定。
<?phpnamespace App\Providers;use App\Models\Article; use App\Policies\ArticlePolicy; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;class AuthServiceProvider extends ServiceProvider {/*** 應(yīng)用的策略映射。** @var array*/protected $policies = [Article::class => ArticlePolicy::class,];/*** 注冊(cè)任意用戶認(rèn)證、用戶授權(quán)服務(wù)。** @return void*/public function boot(){$this->registerPolicies();//} }編寫 Policy 校驗(yàn)邏輯
接下來就在 ArticlePolicy 策略中編寫校驗(yàn)用戶是否擁有修改文章的權(quán)限的方法。
<?phpnamespace App\Policies;use App\Models\Article; use App\User;class ArticlePolicy {public function update(User $user, Article $article){return $user->id == $article->user_id;} }在 update 方法中判斷文章作者id是否等于當(dāng)前登錄的用戶id,返回 true 或 false。true 可以進(jìn)行修改操作,false 則會(huì)拋出沒有權(quán)限。
使用 Policy
然后就是在控制器中的使用了。
<?phpnamespace App\Http\Controllers;use App\Models\Article; use Illuminate\Http\Request;class ArticleController extends Controller {public function edit(Request $request, Article $article){// 校驗(yàn)用戶是否有操作權(quán)限$this->authorize('update', $article);// 更新文章$article->fill($request->all());$article->save();} }authorize 的第一個(gè)參數(shù)表示本次驗(yàn)證使用 ArticlePolicy 里面的 update 方法, $article 實(shí)例用來判斷使用哪一種策略,當(dāng)然也可以不用指定具體實(shí)例,只需要傳遞一個(gè)類名。
$this->authorize('update', Article::class);總結(jié)
以上是生活随笔為你收集整理的Laravel 学习笔记: 授权策略(Policy)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatisPlus 又搞事情,发布权
- 下一篇: 电视剧《乡村爱情2》之演员表(ZT)