Heim > PHP-Framework > Laravel > Hauptteil

Lassen Sie uns über Abfangjäger (Gates) in Laravel sprechen

青灯夜游
Freigeben: 2022-09-29 20:51:16
nach vorne
1653 Leute haben es durchsucht

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.

Einfaches Beispiel

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 的列,根据用户是否是管理员,它可以是 10。我们可以通过如下简单的检查来轻松保护应用程序的一部分模块:

Route::get('administration', function(){
    if(auth()->check() && auth()->user()->admin){
        echo 'Welcome to the admin section';
    } else {
        echo 'You shall not pass';
    }
});
Nach dem Login kopieren

如果特定用户的 admin 行设置为 1 ,他们将看到以下输出。

Admin access screenshot

否则,他们将看到以下内容:

Admin denied access

这看上去很棒对吧!我们有一种简单的方法来允许或拒绝访问我们应用程序中的特定部分。然而问题是:如果整个应用程序中,有大量的位置要检查并修改用户访问权限怎么办。我们将不得不全局搜索代码并在每个地方修改这个逻辑。效率不是很高。

对此,我们可以定义一个 Gate(拦截器)并在整个应用程序中使用它。

定义拦截器

要定义拦截器,可以打开 AppProvidersAuthServiceProvider.php 文件并在我们的 boot() 方法中添加以下内容:

public function boot()
{
    $this->registerPolicies();

    Gate::define('access-admin', function ($user) {
        return $user->admin;
    });
}
Nach dem Login kopieren

我们可以在整个应用中任何想验证管理员用户的地方使用这个拦截器。在下一节中,你将看到我们如何使用这个新的拦截器。

使用拦截器

要使用拦截器,我们可以调用 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';
    }
});
Nach dem Login kopieren

请注意: Gate::denies() 方法会对 Gate::allows() 执行反向检查

拦截器的好处是我们现在可以随时更改我们的定义,授权逻辑会同步在整个应用程序中更改。

使用拦截器的另一个目的是检查与数据相关的权限。以博客为例,我们可以授予用户对他们创建的帖子的编辑权限。

我们可以将数据传递给拦截器以检查用户是否有权执行某项操作。

像拦截器传递数据

假设我们的应用程序有一个 Post 表,其中有一列 user_id,其中包含创建它的用户的 ID。我们可以定义一个 Gate(拦截器)来确定用户是否可以像这样编辑特定的帖子:

Gate::define('edit-post', function ($user, $post) {
    return $user->id === $post->user_id;
});
Nach dem Login kopieren

两个参数被传递给我们的拦截器定义。第一个是 $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';
    }

});
Nach dem Login kopieren

上面,我们在示例中使用了 Route Closures,但我们可能希望将此路由映射到控制器。这也将让我们使用新的 Authorize 函数。

Authorize 授权助手函数

除了效率之外,使用拦截器的另一个原因是辅助函数。

假设我们将路由映射到控制器:

Route::get('edit/{id}', 'PostController@edit');
Nach dem Login kopieren

我们可以使用 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);

    }
}
Nach dem Login kopieren

如果控制器从 AppHttpControllersController 基类继承而来,你可以像使用 Gate::allow() 函数一样使用 authorize() 助手函数。

最后,如果我们想在视图中检查授权怎么办?我们可以使用 @can Blade 函数助手来做到这一点。

在视图层进行鉴权

假设 Blade 视图如下:

nbsp;html>


    <meta>
    <meta>
    <title>{{ $post->title }}</title>


    <h1>{{ $post->title }}</h1>
    <p>{!! $post->body !!}</p>

Nach dem Login kopieren

我们可以使用 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


Nach dem Login kopieren

如果经过身份验证的用户是该帖子的原始作者,他们将看到一个编辑帖子按钮。

使用 @can  助手函数可以使我们的代码更易于阅读和管理。你也可以使用 @cannotrrreee

Wenn die admin-Zeile eines bestimmten Benutzers auf 1 gesetzt ist, wird ihm Folgendes angezeigt Ausgabe.

Screenshot des Administratorzugriffs

Andernfalls sehen sie The Folgender Inhalt:

Admin verweigert Zugriff

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.

Lassen Sie uns über Abfangjäger (Gates) in Laravel sprechen

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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!