在現代 Web 應用程式中,控制誰可以存取或修改資源至關重要。例如,在部落格應用程式中,您可能希望確保只有貼文的擁有者才能編輯或刪除它。 Laravel 提供了兩種優雅的方式來處理授權:Gates 和 Policy Classes。本指南將引導您完成這兩種方法,向您展示如何保護您的資源並確保應用程式的安全。
Gates 提供了一種快速、直接的方法來使用閉包處理授權。它們非常適合簡單的授權檢查,並在 AuthServiceProvider 中定義。
讓我們定義一個門來確保只有帖子所有者才能更新或刪除帖子:
定義 Gate:開啟 AuthServiceProvider 並新增您的 Gate 定義:
// app/Providers/AuthServiceProvider.php use Illuminate\Support\Facades\Gate; use App\Models\Post; public function boot() { $this->registerPolicies(); Gate::define('update-post', function ($user, Post $post) { return $user->id === $post->user_id; }); Gate::define('delete-post', function ($user, Post $post) { return $user->id === $post->user_id; }); }
應用程式閘:在控制器方法中使用閘來強制執行授權邏輯:
// app/Http/Controllers/PostController.php use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; use App\Models\Post; public function update(Request $request, Post $post) { if (Gate::denies('update-post', $post)) { abort(403, 'You do not own this post. ?'); } // Proceed with updating the post } public function destroy(Post $post) { if (Gate::denies('delete-post', $post)) { abort(403, 'You do not own this post. ?'); } // Proceed with deleting the post }
優點:
缺點:
最佳用例:需要快速授權檢查的小型應用程式或簡單用例。 ?
策略類別提供了一種更結構化和可擴展的方法來處理授權。它們提供了一種清晰的方法來管理複雜的授權規則並保持程式碼井井有條。在使用包含標準CRUD 操作的資源控制器時,策略特別有用:index、create、edit、update 和edit、
update
建立和使用策略
php artisan make:policy PostPolicy:使用 Artisan 建立策略類別:
php artisan make:policy PostPolicy
// app/Policies/PostPolicy.php namespace App\Policies; use App\Models\User; use App\Models\Post; class PostPolicy { /** * Determine if the user can view the list of posts. * * @param User $user * @return bool */ public function viewAny(User $user) { // Example logic to allow viewing posts for authenticated users return true; } /** * Determine if the user can create a post. * * @param User $user * @return bool */ public function create(User $user) { return true; } /** * Determine if the user can update the post. * * @param User $user * @param Post $post * @return bool */ public function update(User $user, Post $post) { return $user->id === $post->user_id; } /** * Determine if the user can delete the post. * * @param User $user * @param Post $post * @return bool */ public function delete(User $user, Post $post) { return $user->id === $post->user_id; } }:開啟產生的策略類別並新增方法來處理每個操作的授權:
//app/Policies/PostPolicy.php
命名空間應用\策略;
使用應用程式\模型\使用者;
使用App\Models\Post;
類別貼文策略
{
/**
* 確定使用者是否可以查看貼文清單。
*
* @param 使用者 $user
* @返回布林值
*/
公用函數viewAny(用戶$user)
{
// 允許查看經過身份驗證的使用者的貼文的範例邏輯
返回真;
}
/**
* 確定使用者是否可以建立貼文。
*
* @param 使用者 $user
* @返回布林值
*/
公用函數創建(用戶$用戶)
{
返回真;
}
/**
* 確定使用者是否可以更新貼文。
*
* @param 使用者 $user
* @param Post $post
* @返回布林值
*/
公共功能更新(使用者$user,貼文$post)
{
回傳 $user->id === $post->user_id;
}
/**
* 確定使用者是否可以刪除貼文。
*
* @param 使用者 $user
* @param Post $post
* @返回布林值
*/
公用函數刪除(使用者$user,貼文$post)
{
回傳 $user->id === $post->user_id;
}
}
// app/Http/Controllers/PostController.php use Illuminate\Http\Request; use App\Models\Post; public function update(Request $request, Post $post) { $this->authorize('update', $post); // Proceed with updating the post } public function destroy(Post $post) { $this->authorize('delete', $post); // Proceed with deleting the post }:在控制器操作中應用策略方法:
策略類別的優缺點
框架支援:利用 Laravel 的內建框架支援來實現一致的授權。 ?
複雜度:對於非常簡單的授權場景可能有點過分了。 ?
概括 Laravel 中的 Gates 和 Policy Class 都提供了處理授權的強大方法。門非常適合快速、簡單的檢查,而策略類別提供了管理複雜場景的結構化方法,特別是在具有index、create、edit、
更新、銷毀。選擇最適合您的應用程式需求的方法,並享受安全、組織良好的程式碼庫! ??
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3