」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Laravel 中的授權 - 初學者指南

Laravel 中的授權 - 初學者指南

發佈於2024-11-07
瀏覽:626

Authorization In Laravel - A Beginner

掌握 Laravel 中的授權:Gates 與策略類別 ??

在現代 Web 應用程式中,控制誰可以存取或修改資源至關重要。例如,在部落格應用程式中,您可能希望確保只有貼文的擁有者才能編輯或刪除它。 Laravel 提供了兩種優雅的方式來處理授權:GatesPolicy Classes。本指南將引導您完成這兩種方法,向您展示如何保護您的資源並確保應用程式的安全。

Laravel 的蓋茲?

Gates 提供了一種快速、直接的方法來使用閉包處理授權。它們非常適合簡單的授權檢查,並在 AuthServiceProvider 中定義。

設定門

讓我們定義一個門來確保只有帖子所有者才能更新或刪除帖子:

  1. 定義 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;
        });
    }
    
  2. 應用程式閘:在控制器方法中使用閘來強制執行授權邏輯:

    // 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
    }
    

蓋茲的優點和缺點

優點

  • 簡單:使用最少的程式碼即可快速設定。 ⚡
  • 簡單的理想選擇:非常適合單一資源應用程式或簡單的場景。 ?

缺點

  • 可擴展性:隨著應用程式的成長,可能會變得麻煩且難以管理。 ?
  • 維護:如果組織不好,可能會變得混亂。 ?

最佳用例:需要快速授權檢查的小型應用程式或簡單用例。 ?

Laravel 中的策略類別? ️

策略類別提供了一種更結構化和可擴展的方法來處理授權。它們提供了一種清晰的方法來管理複雜的授權規則並保持程式碼井井有條。在使用包含標準CRUD 操作的資源控制器時,策略特別有用:indexcreateeditupdateedit

update

破壞
  1. 建立和使用策略

    php artisan make:policy PostPolicy
    
    :使用 Artisan 建立策略類別:
  2. 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;
        }
    }
    
    :開啟產生的策略類別並新增方法來處理每個操作的授權:
  3. //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
    }
    
    :在控制器操作中應用策略方法:

//app/Http/Controllers/PostController.php 使用 Illuminate\Http\Request; 使用App\Models\Post; 公共功能更新(請求$ request,發布$ post) { $this->authorize('update', $post); // 繼續更新貼文 } 公共函數 destroy(Post $post) { $this->authorize('刪除', $post); // 繼續刪除貼文 }

策略類別的優缺點

  • 優點
  • 組織:提供一種乾淨且有組織的方式來處理複雜的授權邏輯。 ?
  • 可維護性:隨著應用程式的成長,更容易管理和維護。 ️

框架支援:利用 Laravel 的內建框架支援來實現一致的授權。 ?

  • 缺點
  • 初始設定:與門相比,設定稍微多一些。 ⚙️

複雜度:對於非常簡單的授權場景可能有點過分了。 ?


最佳案例場景

:非常適合具有複雜授權要求的應用程式或目標是乾淨、可維護的程式碼。 ?

概括 Laravel 中的 Gates 和 Policy Class 都提供了處理授權的強大方法。門非常適合快速、簡單的檢查,而策略類別提供了管理複雜場景的結構化方法,特別是在具有indexcreateedit

更新、銷毀

。選擇最適合您的應用程式需求的方法,並享受安全、組織良好的程式碼庫! ??Authorization In Laravel - A Beginner

版本聲明 本文轉載於:https://dev.to/mohammed_kareem/authorization-in-laravel-a-beginners-guide-32kf?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    程式設計 發佈於2025-07-13
  • Android如何向PHP服務器發送POST數據?
    Android如何向PHP服務器發送POST數據?
    在android apache httpclient(已棄用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    程式設計 發佈於2025-07-13
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-07-13
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-07-13
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-07-13
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-07-13
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-07-13
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-07-13
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-07-13
  • Go語言如何動態發現導出包類型?
    Go語言如何動態發現導出包類型?
    與反射軟件包中的有限類型的發現能力相反,本文探索了替代方法,探索了在Runruntime。 go import( “ FMT” “去/進口商” ) func main(){ pkg,err:= incorter.default()。導入(“ time”) 如果er...
    程式設計 發佈於2025-07-13
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的python功能eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。本文深入研究了eval()和ast.literal_eval()之間的差異,突出顯示其安全性含義...
    程式設計 發佈於2025-07-13
  • 編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    錯誤:“ usr/bin/ld:找不到-l “ 此錯誤表明鏈接器在鏈接您的可執行文件時無法找到指定的庫。為了解決此問題,我們將深入研究如何指定庫路徑並將鏈接引導到正確位置的詳細信息。 添加庫搜索路徑的一個可能的原因是,此錯誤是您的makefile中缺少庫搜索路徑。要解決它,您可以在鏈接器命令中添...
    程式設計 發佈於2025-07-13
  • 使用jQuery如何有效修改":after"偽元素的CSS屬性?
    使用jQuery如何有效修改":after"偽元素的CSS屬性?
    在jquery中了解偽元素的限制:訪問“ selector 嘗試修改“:”選擇器的CSS屬性時,您可能會遇到困難。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    程式設計 發佈於2025-07-13
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確預期操作結果的火災和...
    程式設計 發佈於2025-07-13
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-07-13

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3