Heim > Artikel > PHP-Framework > Lassen Sie uns über Abfangjäger (Gates) in Laravel sprechen
Mit Laravel Gates (Abfangjägern) können Sie Benutzern den Zugriff auf bestimmte Bereiche Ihrer Anwendung autorisieren. Sie können ganz einfach Interceptoren in Ihrer Anwendung definieren und diese dann verwenden, um den Zugriff zu erlauben oder zu verweigern.
Angenommen, in der Benutzertabelle gibt es eine Spalte mit dem Namen admin
. Je nachdem, ob der Benutzer ein Administrator ist, kann sie 1
oder 0. Wir können ein Modul unserer Anwendung ganz einfach mit einer einfachen Prüfung wie dieser sichern: 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(拦截器)并在整个应用程序中使用它。
要定义拦截器,可以打开 AppProvidersAuthServiceProvider.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 函数。
除了效率之外,使用拦截器的另一个原因是辅助函数。
假设我们将路由映射到控制器:
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); } }
如果控制器从 AppHttpControllersController
基类继承而来,你可以像使用 Gate::allow()
函数一样使用 authorize()
助手函数。
最后,如果我们想在视图中检查授权怎么办?我们可以使用 @can
Blade 函数助手来做到这一点。
假设 Blade 视图如下:
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1>{{ $post->title }}</h1> <p>{!! $post->body !!}</p>
我们可以使用 Blade 助手函数 @can
检查当前用户是否被允许编辑这篇文章:
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1>{{ $post->title }}</h1> <p>{!! $post->body !!}</p> @can('edit-post', $post) id }}">Edit Post @endcan
如果经过身份验证的用户是该帖子的原始作者,他们将看到一个编辑帖子按钮。
使用 @can
助手函数可以使我们的代码更易于阅读和管理。你也可以使用 @cannot
rrreee
admin
-Zeile eines bestimmten Benutzers auf 1
gesetzt ist, wird ihm Folgendes angezeigt Ausgabe. Das sieht so aus Großartig, oder? Wir haben eine einfache Möglichkeit, den Zugriff auf bestimmte Teile unserer Anwendung zu erlauben oder zu verweigern. Das Problem ist jedoch: Was passiert, wenn es in der Anwendung viele Stellen gibt, an denen Benutzerzugriffsberechtigungen überprüft und geändert werden müssen? Wir müssten den Code global durchsuchen und diese Logik überall ändern. Nicht sehr effizient. 🎜🎜Dazu können wir ein Gate (Interceptor) definieren und es in der gesamten Anwendung verwenden. 🎜🎜🎜Abfangjäger definieren🎜🎜🎜Um Abfangjäger zu definieren, können Sie die Datei
AppProvidersAuthServiceProvider.php
öffnen und den folgenden Inhalt in unsere Methode boot()
einfügen: 🎜rrreee🎜 Wir können diesen Interceptor überall in der Anwendung verwenden, wo wir den Admin-Benutzer authentifizieren möchten. Im nächsten Abschnitt erfahren Sie, wie wir diesen neuen Abfangjäger verwenden. 🎜🎜🎜Interceptoren verwenden🎜🎜🎜Um Interceptoren zu verwenden, können wir die Methode Gate::allows()
oder Gate::denies()
wie folgt aufrufen: 🎜rrreee🎜Bitte beachten Sie: Die Methode Gate::denies()
führt eine umgekehrte Prüfung für Gate::allows()
durch 🎜🎜Interceptor Der Vorteil ist dass wir unsere Definition nun jederzeit ändern können und die Autorisierungslogik synchron in der gesamten Anwendung geändert wird. 🎜🎜Ein weiterer Zweck des Einsatzes von Interceptoren besteht darin, Berechtigungen im Zusammenhang mit Daten zu überprüfen. Am Beispiel eines Blogs können wir Benutzern Bearbeitungsrechte für von ihnen erstellte Beiträge erteilen. 🎜🎜Wir können Daten an den Interceptor übergeben, um zu prüfen, ob der Benutzer die Berechtigung zum Ausführen einer Aktion hat. 🎜🎜🎜Übergabe von Daten wie Abfangjäger🎜🎜🎜Angenommen, unsere Anwendung hat eine 🎜Post🎜-Tabelle mit einer Spalte user_id
, die die 🎜ID🎜 des Benutzers enthält, der sie erstellt hat. Wir können ein Gate (Interceptor) definieren, um zu bestimmen, ob ein Benutzer einen bestimmten Beitrag wie folgt bearbeiten kann: 🎜rrreee🎜 Zwei Parameter werden an unsere Interceptor-Definition übergeben. Der erste Parameter ist das Objekt $user
, das den authentifizierten Benutzer enthält, und der zweite Parameter ist unser Objekt $post
. 🎜🎜Tipps: Wenn kein authentifizierter Benutzer vorhanden ist, gibt der Interceptor „false“ zurück. 🎜🎜Der Interceptor erlaubt den Zugriff, wenn der authentifizierte Benutzer der ursprüngliche Autor ist; andernfalls verweigert er den Zugriff. 🎜🎜Hier ist ein kurzes Beispiel dafür, wie wir den neuen
edit-post
-Interceptor verwenden können. 🎜rrreee🎜Oben haben wir im Beispiel Routensperrungen verwendet, aber vielleicht möchten wir diese Route einem Controller zuordnen. Dadurch können wir auch die neue Funktion „Authorize“ nutzen. 🎜🎜🎜Autorisierungs-Hilfsfunktion autorisieren 🎜🎜🎜Neben der Effizienz ist die Hilfsfunktion ein weiterer Grund für die Verwendung von Interceptoren. 🎜🎜Angenommen, wir ordnen die Route dem Controller zu: 🎜rrreee🎜 Wir können den authorize()
-Helfer verwenden, um zu überprüfen, ob der authentifizierte Benutzer die Berechtigung zum Bearbeiten des Beitrags hat: 🎜rrreee🎜Wenn der Controller startet von Von der Basisklasse AppHttpControllersController
geerbt, können Sie die Hilfsfunktion authorize()
genau wie die Funktion Gate::allow()
verwenden. 🎜🎜Abschließend: Was ist, wenn wir die Autorisierung in der Ansicht überprüfen möchten? Wir können dies mit dem Blade-Funktionshelfer @can
tun. 🎜🎜🎜Authentifizierung auf der Ansichtsebene🎜🎜🎜Angenommen, die Blade-Ansicht sieht wie folgt aus: 🎜rrreee🎜Wir können die Blade-Hilfsfunktion @can
verwenden, um zu überprüfen, ob der aktuelle Benutzer diesen Artikel bearbeiten darf : 🎜rrreee🎜Bei authentifizierten Benutzern, die die ursprünglichen Autoren des Beitrags sind, wird die Schaltfläche 🎜Beitrag bearbeiten🎜 angezeigt. 🎜🎜Die Verwendung der @can
-Hilfsfunktion kann das Lesen und Verwalten unseres Codes erleichtern. Sie können auch @cannot
verwenden, um das Gegenteil zu tun. 🎜🎜🎜Zusammenfassung🎜🎜🎜Hier sind die Grundlagen der Verwendung von Gates (Abfangjägern) in Laravel-Anwendungen. Mithilfe von Interceptors können wir bestimmte Benutzer problemlos für den Zugriff auf Bereiche unserer Anwendung autorisieren. Dies kann auch als „Zugriffskontrollliste“ (ACL) bezeichnet werden, eine Liste von Berechtigungen, die einem Objekt zugeordnet sind. 🎜Aber wir sollten die Dinge nicht zu kompliziert machen ... Im einfachsten Szenario werden Abfangjäger verwendet, um den Zugriff zu erlauben oder zu verweigern. Benutzern kann entweder die Autorisierung gewährt oder die Autorisierung verweigert werden.
Da es in diesem Tutorial darum geht, den Benutzer durchzubringen und nicht durch ... ist es sinnvoll, Sie mit diesem Bild von Gandalf aus „Herr der Ringe“ (manueller Hundekopf) hinauszuschicken.
Um mehr über Laravel Gates (Abfangjäger) zu erfahren, besuchen Sie unbedingt die Laravel-Autorisierungsdokumentation.
Englische Originaladresse: https://devdojo.com/tnylea/laravel-gates
Übersetzungsadresse: https://learnku.com/laravel/t/67585
[Verwandte Empfehlungen: Laravel-Video-Tutorial 】
Das obige ist der detaillierte Inhalt vonLassen Sie uns über Abfangjäger (Gates) in Laravel sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!