Laravel Gates(攔截器)允許你授權使用者存取應用程式的某些區域。你可以輕鬆地在應用程式中定義攔截器,然後使用它們來允許或拒絕存取。
簡單範例
假設在使用者表中,有一個名為admin
的列,根據使用者是否是管理員,它可以是1
或0
。我們可以透過以下簡單的檢查來輕鬆保護應用程式的一部分模組:
Route::get('administration', function(){ if(auth()->check() && auth()->user()->admin){ echo 'Welcome to the admin section'; } else { echo 'You shall not pass'; } });
如果特定使用者的admin
行設定為1
,他們將看到以下輸出。
否則,他們會看到以下內容:
這看起來很棒吧!我們有一種簡單的方法來允許或拒絕存取我們應用程式中的特定部分。然而問題是:如果在整個應用程式中,有大量的位置要檢查並修改使用者存取權限怎麼辦。我們將不得不全域搜尋程式碼並在每個地方修改這個邏輯。效率不是很高。
對此,我們可以定義一個 Gate(攔截器)並在整個應用程式中使用它。
定義攔截器
要定義攔截器,可以開啟App\Providers\AuthServiceProvider.php
檔案並在我們的boot ()
方法中加入以下內容:
public function boot() { $this->registerPolicies(); Gate::define('access-admin', function ($user) { return $user->admin; }); }
我們可以在整個應用程式中任何想驗證管理員使用者的地方使用這個攔截器。在下一節中,你將會看到我們如何使用這個新的攔截器。
使用攔截器
要使用攔截器,我們可以呼叫Gate::allows()
或Gate::denies( )
方法,如下所示:
Route::get('administration', function(){ if (Gate::allows('access-admin')) { echo 'Welcome to the admin section'; } else { echo 'You shall not pass'; } });
請注意:
Gate::denies()
方法會對Gate::allows()
執行反向檢查
攔截器的好處是我們現在可以隨時更改我們的定義,授權邏輯會同步在整個應用程式中更改。
使用攔截器的另一個目的是檢查與資料相關的權限。以部落格為例,我們可以授予使用者對他們所建立的貼文的編輯權限。
我們可以將資料傳遞給攔截器以檢查使用者是否有權執行某項操作。
像是攔截器傳遞資料
假設我們的應用程式有一個Post 表,其中有一列user_id
,其中包含創建它的用戶的ID。我們可以定義一個 Gate(攔截器)來確定使用者是否可以像這樣編輯特定的貼文:
Gate::define('edit-post', function ($user, $post) { return $user->id === $post->user_id; });
兩個參數被傳遞給我們的攔截器定義。第一個是 $user
對象,其中包含經過驗證的用戶,第二個參數是我們的 $post
物件。
小Tips:如果沒有經過身份驗證的用戶,攔截器將返回 false。
如果經過身份驗證的使用者是原始作者,攔截器將允許存取;否則將拒絕存取。
下面是一個快速範例,說明我們如何使用新的 edit-post
攔截器。
Route::get('edit/{id}', function($id){ $post = \App\Model\Post::find($id); if( Gate::allows('edit-post', $post) ){ echo 'You can edit this post'; } else { echo 'You shall not pass'; } });
上面,我們在範例中使用了 Route Closures,但我們可能想要將此路由對應到控制器。這也將讓我們使用新的 Authorize 函數。
Authorize 授權助理函數
除了效率之外,使用攔截器的另一個原因是輔助函數。
假設我們將路由對應到控制器:
Route::get('edit/{id}', 'PostController@edit');
我們可以使用authorize()
助手來檢查經過驗證的使用者是否有權編輯貼文:
<?php namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request; class PostController extends Controller { public function edit($id){ $post = Post::find($id); $this->authorize('edit-post', $post); } }
如果控制器從App\Http\Controllers\Controller
基底類別繼承而來,你可以像使用Gate::allow()
函數一樣使用 authorize()
助手函數。
最後,如果我們想在視圖中檢查授權怎麼辦?我們可以使用 @can
Blade 函數助手來做到這一點。
在視圖層進行鑑權
假設Blade 視圖如下:
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1 id="post-gt-title">{{ $post->title }}</h1> <p>{!! $post->body !!}</p>
我們可以使用Blade 助手函數@can
#檢查當前用戶是否被允許編輯這篇文章:
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1 id="post-gt-title">{{ $post->title }}</h1> <p>{!! $post->body !!}</p> @can('edit-post', $post) id }}">Edit Post @endcan
如果經過身份驗證的用戶是該帖子的原始作者,他們將看到一個編輯帖子按鈕。
使用 @can
助手函數可以讓我們的程式碼更容易閱讀和管理。你也可以用 @cannot
作反向運算。
小結
這是在 Laravel 應用程式中使用 Gates(攔截器)的基礎知識。攔截器允許我們輕鬆授權特定使用者存取我們的應用程式區域。這也可以稱為存取控制清單 (ACL),即與物件關聯的權限清單。
但是我們不應該使事情過於複雜......在最簡單的場景中,攔截器 用於允許或拒絕訪問。使用者既可以被允許授權,同時也可以被拒絕授權。
因為本教程是關於讓用戶通過而不是通過......所以有必要用這張來自指環王的甘道夫圖像送你出去(手動狗頭)。
要了解有關 Laravel Gates(攔截器)的更多信息,請務必訪問 Larave 授權相關的文檔。
英文原文網址:https://devdojo.com/tnylea/laravel-gates
翻譯網址:https://learnku.com/laravel/t/67585
【相關推薦:laravel影片教學】
以上是聊聊Laravel中的攔截器(Gates)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Laravel适合快速构建Web应用,而Python适用于更广泛的应用场景。1.Laravel提供EloquentORM、Blade模板引擎和Artisan工具,简化Web开发。2.Python以动态类型、丰富的标准库和第三方生态系统著称,适用于Web开发、数据科学等领域。

Laravel和Python各有優勢:Laravel適合快速構建功能豐富的Web應用,Python在數據科學和通用編程領域表現出色。 1.Laravel提供EloquentORM和Blade模板引擎,適合構建現代Web應用。 2.Python擁有豐富的標準庫和第三方庫,Django和Flask框架滿足不同開發需求。

Laravel值得選擇,因為它能使代碼結構清晰,開發過程更具藝術性。 1)Laravel基於PHP,遵循MVC架構,簡化Web開發。 2)其核心功能如EloquentORM、Artisan工具和Blade模板增強了開發的優雅與健壯性。 3)通過路由、控制器、模型和視圖,開發者能高效構建應用。 4)隊列和事件監聽等高級功能進一步提升應用性能。

Laravel不僅是後端框架,還是完整的Web開發解決方案。它提供了強大的後端功能,如路由、數據庫操作、用戶認證等,並支持前端開發,提升了整個Web應用的開發效率。

Laravel适合Web开发,Python适用于数据科学和快速原型开发。1.Laravel基于PHP,提供优雅的语法和丰富功能,如EloquentORM。2.Python以简洁著称,广泛应用于Web开发和数据科学,拥有丰富的库生态系统。

laravelcanbeeffectefection ininreal-worldapplications forbuildingscalablewebsolutions.1)ITSImplifieCrudoperationsInrestfulaPisusingEloquentorm.2)laravel'secosystem,包括Toolslikenova,包括Toolslikenova,增強功能

Laravel在後端開發中的核心功能包括路由系統、EloquentORM、遷移功能、緩存系統和隊列系統。 1.路由系統簡化了URL映射,提高了代碼組織和維護性。 2.EloquentORM提供了面向對象的數據操作,提升了開發效率。 3.遷移功能通過版本控制管理數據庫結構,確保一致性。 4.緩存系統減少數據庫查詢,提升響應速度。 5.隊列系統有效處理大規模數據,避免阻塞用戶請求,提升整體性能。

Laravel在後端開發中表現強大,通過EloquentORM簡化數據庫操作,控制器和服務類處理業務邏輯,並提供隊列、事件等功能。 1)EloquentORM通過模型映射數據庫表,簡化查詢。 2)業務邏輯在控制器和服務類中處理,提高模塊化和可維護性。 3)其他功能如隊列系統幫助處理複雜需求。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版
中文版,非常好用

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器