Tore und Richtlinien in Laravel

Heute werden wir das Autorisierungssystem des Laravel Web Frameworks diskutieren. Das Laravel-Framework implementiert Autorisierung in Form von Gattern und Richtlinien. Nach einer Einführung in Gates und Richtlinien werde ich die Konzepte anhand eines benutzerdefinierten Beispiels demonstrieren.

Ich gehe davon aus, dass Sie das integrierte Laravel-Authentifizierungssystem bereits kennen, da dies für das Verständnis der Autorisierung unerlässlich ist. Das Autorisierungssystem arbeitet offensichtlich mit dem Authentifizierungssystem zusammen, um die legitime Benutzersitzung zu identifizieren.

Wenn Sie das Laravel-Authentifizierungssystem nicht kennen, würde ich dringend empfehlen, die offizielle Dokumentation durchzugehen, die Ihnen praktische Einblicke in das Thema vermittelt.

Laravel's Autorisierungsansatz

Inzwischen sollten Sie bereits wissen, dass das Laravel-Autorisierungssystem in zwei Ausführungen und Richtlinien verfügbar ist. Auch wenn es sich nach einer komplizierten Angelegenheit anhört, würde ich sagen, dass es ziemlich einfach ist, es zu implementieren, sobald Sie den Dreh raus haben!

Mit Gates können Sie eine Autorisierungsregel mithilfe eines einfachen Abschlussansatzes definieren. Mit anderen Worten, wenn Sie eine Aktion autorisieren möchten, die sich nicht auf ein bestimmtes Modell bezieht, ist das Gate der perfekte Ort, um diese Logik zu implementieren.

Schauen wir uns kurz an, wie die Gate-basierte Autorisierung aussieht:

… Gate :: define ('update-post', Funktion ($ user, $ post) return $ user-> id == $ post-> user_id;);… 

Das obige Snippet definiert die Autorisierungsregel Update-Post dass Sie von überall in Ihrer Anwendung anrufen können.

Auf der anderen Seite sollten Sie Richtlinien verwenden, wenn Sie die Berechtigungslogik eines Modells gruppieren möchten. Angenommen, Sie haben in Ihrer Anwendung ein Post-Modell, und Sie möchten die CRUD-Aktionen dieses Modells autorisieren. In diesem Fall müssen Sie die Richtlinie implementieren.

Klasse PostPolicy Öffentliche Funktionsansicht (Benutzer $ user, Post $ post)  öffentliche Funktion create (User $ user)  Aktualisierung öffentlicher Funktionen (User $ user, Post $ post)  öffentliche Funktion delete (User $ user, Post $ post) 

Wie Sie sehen, ist dies eine ziemlich einfache Richtlinienklasse, die die Autorisierung für die CRUD-Aktionen von definiert Post Modell-.

Das war also eine Einführung in Tore und Richtlinien in Laravel. Ab dem nächsten Abschnitt gehen wir eine praktische Demonstration jedes Elements durch.

Gates

In diesem Abschnitt sehen Sie ein Beispiel aus der Praxis, um das Konzept der Tore zu verstehen.

In den meisten Fällen suchen Sie den Laravel-Dienstanbieter, wenn Sie eine Komponente oder einen Dienst registrieren möchten. Nach dieser Konvention definieren wir unser benutzerdefiniertes Gate im app / Providers / AuthServiceProvider.php wie im folgenden Ausschnitt gezeigt.

 "App \ Policies \ ModelPolicy",]; / ** * Registrieren Sie alle Authentifizierungs- / Autorisierungsdienste. * * @return void * / public function boot () $ this-> registerPolicies (); Gate :: define ('update-post', Funktion ($ user, $ post) return $ user-> id == $ post-> user_id;); 

In dem Stiefel Methode haben wir unser benutzerdefiniertes Gate definiert:

Gate :: define ('update-post', Funktion ($ user, $ post) return $ user-> id == $ post-> user_id;);

Bei der Definition eines Gates wird eine Schließung benötigt, die basierend auf der in der Gatterdefinition definierten Berechtigungslogik entweder TRUE oder FALSE zurückgibt. Neben der Schließfunktion gibt es noch andere Möglichkeiten, wie Sie Tore definieren können.

Die folgende Gate-Definition ruft zum Beispiel die Controller-Aktion anstelle der Schließfunktion auf.

Gate :: define ('update-post', 'ControllerName @ MethodName');

Lassen Sie uns nun eine benutzerdefinierte Route hinzufügen, um eine Demonstration der Funktionsweise der Gate-basierten Autorisierung zu zeigen. In der Routendatei routen / web.php, Lassen Sie uns die folgende Route hinzufügen.

Route :: get ('service / post / gate', 'PostController @ gate');

Erstellen wir eine zugehörige Controller-Datei app / HTTP / Controller / PostController.php auch.

In den meisten Fällen verwenden Sie entweder die erlaubt oder bestreitet Methode der Tor Fassade, um eine bestimmte Aktion zu genehmigen. In unserem obigen Beispiel haben wir die verwendet erlaubt Methode, um zu überprüfen, ob der aktuelle Benutzer das ausführen kann Update-Post Aktion.

Benutzer mit scharfen Augen hätten bemerkt, dass wir nur das zweite Argument bestanden haben $ post zum Verschluss. Das erste Argument, der aktuell angemeldete Benutzer, wird automatisch vom eingeblendet Tor Fassade.

So sollten Sie Gates verwenden, um Aktionen in Ihrer Laravel-Anwendung zu autorisieren. Im nächsten Abschnitt erfahren Sie, wie Sie Richtlinien verwenden, wenn Sie die Autorisierung für Ihre Modelle implementieren möchten.

Richtlinien

Wenn Sie Ihre Autorisierungsaktionen für ein bestimmtes Modell oder eine bestimmte Ressource logisch gruppieren möchten, suchen Sie, wie bereits erwähnt, nach der Richtlinie.

In diesem Abschnitt erstellen wir eine Richtlinie für das Post-Modell, die zur Autorisierung aller CRUD-Aktionen verwendet wird. Ich gehe davon aus, dass Sie das Post-Modell bereits in Ihrer Anwendung implementiert haben. Ansonsten wird etwas Ähnliches funktionieren.

Die Laravel Handwerker command ist dein bester Freund, wenn es darum geht, Code zu erstellen. Mit dem folgenden Befehl können Sie eine Richtlinie für das Post-Modell erstellen.

$ php Handwerker make: policy PostPolicy --model = Post

Wie Sie sehen können, haben wir das geliefert --Modell = Post Argument, so dass alle CRUD-Methoden erstellt werden. Andernfalls wird eine leere Richtlinienklasse erstellt. Sie finden die neu erstellte Richtlinienklasse unter app / Policies / PostPolicy.php.

Ersetzen wir es durch den folgenden Code.

id> 0;  / ** * Bestimmen Sie, ob der Benutzer den Beitrag aktualisieren kann. * * @param \ App \ Benutzer $ user * @param \ App \ Post $ post * @return mixed * / öffentliche Funktionsaktualisierung (Benutzer $ user, Post $ post) return $ user-> id == $ post-> Benutzeridentifikation;  / ** * Bestimmen Sie, ob der Benutzer den Beitrag löschen kann. * * @param \ App \ Benutzer $ user * @param \ App \ Post $ post * @return mixed * / public function delete (Benutzer $ user, Post $ post) return $ user-> id == $ post-> Benutzeridentifikation; 

Um unsere Policy-Klasse verwenden zu können, müssen wir sie beim Laravel-Service-Provider registrieren, wie im folgenden Snippet gezeigt.

 'App \ Policies \ ModelPolicy', Post :: class => PostPolicy :: class]; / ** * Registrieren Sie alle Authentifizierungs- / Autorisierungsdienste. * * @return void * / public function boot () $ this-> registerPolicies (); 

Wir haben das Mapping unserer Richtlinie in das hinzugefügt $ Policies Eigentum. Es teilt Laravel mit, die entsprechende Richtlinienmethode aufzurufen, um die CRUD-Aktion zu autorisieren.

Sie müssen die Richtlinien auch mit dem registrieren registerPolicies Methode, wie wir es in der getan haben Stiefel Methode.

Lassen Sie uns weitergehen und erstellen Sie ein paar benutzerdefinierte Routen in der routen / web.php Datei, damit wir unsere Richtlinienmethoden dort testen können.

Route :: get ('service / post / view', 'PostController @ view'); Route :: get ('service / post / create', 'PostController @ create'); Route :: get ('service / post / update', 'PostController @ update'); Route :: get ('service / post / delete', 'PostController @ delete');

Zum Schluss erstellen wir einen zugehörigen Controller unter app / HTTP / Controller / PostController.php.

can ('view', $ post)) echo "Der aktuell angemeldete Benutzer darf den Beitrag aktualisieren: $ post-> id";  else echo 'Nicht autorisiert.';  public function create () // aktuell angemeldeten Benutzer abrufen $ user = Auth :: user (); if ($ user-> can ('create', Post :: class)) echo 'Der aktuell angemeldete Benutzer darf neue Beiträge erstellen.';  else echo 'Nicht autorisiert';  Ausfahrt;  public function update () // aktuell angemeldeten Benutzer abrufen $ user = Auth :: user (); // post laden $ post = post :: find (1); if ($ user-> can ('update', $ post)) echo "Der aktuell angemeldete Benutzer darf den Beitrag aktualisieren: $ post-> id";  else echo 'Nicht autorisiert.';  public function delete () // aktuell angemeldeten Benutzer abrufen $ user = Auth :: user (); // post laden $ post = post :: find (1); if ($ user-> can ('delete', $ post)) echo "Der aktuell angemeldete Benutzer darf den Beitrag löschen: $ post-> id";  else echo 'Nicht autorisiert.'; 

Es gibt verschiedene Möglichkeiten, wie Sie Ihre Aktionen mithilfe von Richtlinien autorisieren können. In unserem obigen Beispiel haben wir die verwendet Nutzer Modell, um unsere zu autorisieren Post Modellaktionen.

Das Benutzermodell bietet zwei nützliche Methoden für die Autorisierung-können und kippen. Das können Diese Methode wird verwendet, um zu prüfen, ob der aktuelle Benutzer eine bestimmte Aktion ausführen kann. Und das Gegenstück zum können Methode, die kippen Methode wird verwendet, um die Unfähigkeit der Aktionsausführung zu ermitteln.

Lassen Sie uns den Ausschnitt der Aussicht Methode vom Controller, um zu sehen, was genau es tut.

public function view () // Holen Sie sich den aktuell angemeldeten Benutzer $ user = Auth :: user (); // post laden $ post = post :: find (1); if ($ user-> can ('view', $ post)) echo "Der aktuell angemeldete Benutzer darf den Beitrag aktualisieren: $ post-> id";  else echo 'Nicht autorisiert.'; 

Zunächst laden wir den aktuell angemeldeten Benutzer, wodurch wir das Objekt des Benutzermodells erhalten. Als Nächstes laden wir einen Beispielpost mit dem Post-Modell.

Voran haben wir die verwendet können Methode des Benutzermodells zur Autorisierung der Aussicht Aktion der Post Modell. Das erste Argument der können method ist der Aktionsname, den Sie autorisieren möchten, und das zweite Argument ist das Modellobjekt, für das Sie eine Berechtigung erhalten möchten.

Das war eine Demonstration, wie man das benutzt Nutzer Modell zur Autorisierung der Aktionen mithilfe von Richtlinien. Alternativ können Sie auch die Controller-Helfer auch, wenn Sie sich im Controller befinden und gleichzeitig eine bestimmte Aktion autorisieren.

… $ This-> authorize ('view', $ post);… 

Wie Sie sehen, müssen Sie das Benutzermodell nicht laden, wenn Sie den Controller Helper verwenden.

Das war also das Konzept von Richtlinien, das Ihnen zur Verfügung steht, und es ist sehr praktisch, wenn Sie ein Modell oder eine Ressource autorisieren, da Sie damit die Berechtigungslogik an einer Stelle gruppieren können.

Stellen Sie nur sicher, dass Sie keine Gates und Richtlinien für die gleichen Aktionen des Modells verwenden, da sonst Probleme auftreten. Das war es von meiner Seite für heute, und ich werde es einen Tag nennen!

Fazit

Heute stand in meinem Artikel die Autorisierung von Laravel im Mittelpunkt. Am Anfang des Artikels habe ich die wichtigsten Elemente der Autorisierung, Tore und Richtlinien von Laravel vorgestellt.

Anschließend haben wir unser eigenes Gate und unsere Richtlinien erstellt, um zu sehen, wie es in der realen Welt funktioniert. Ich hoffe, dass Ihnen der Artikel gefallen hat und Sie im Zusammenhang mit Laravel etwas Nützliches gelernt haben.

Für diejenigen unter Ihnen, die entweder gerade mit Laravel beginnen oder Ihr Wissen, Ihre Site oder Anwendung mit Erweiterungen erweitern möchten, haben wir eine Reihe von Dingen, die Sie auf dem Envato-Markt studieren können.

Wie immer würde ich mich freuen, von Ihnen in Form von Kommentaren über den untenstehenden Feed zu hören!