2016-01-26 12 views
12

Ich entwickle eine App mit Laravel, erkannte ich, dass was mit Policy getan werden kann, kann genau mit Middleware getan werden. Angenommen, ich möchte verhindern, dass ein Benutzer eine Route aktualisiert, wenn er nicht der Eigentümer der Informationen ist. Ich kann die Route einfach überprüfen und kann dies auch anhand der Richtlinie tun.Laravel: Unterschied zwischen Route Middleware und Politik

Also meine Frage ist, warum ich policy über Middleware verwenden sollte und umgekehrt

+2

Ich denke, man sollte es so aussehen versuchen: * Middleware * für * Authentifizieren verwendet * während * Richtlinien * sind für die Verwendung von * Genehmigung *. – haakym

Antwort

10

Strecke Middleware ermöglicht es Ihnen Anfrage beziehen sich auf eine große Auswahl an Routen Handhabung, sondern in jeder Controller-Aktion den Code zu wiederholen - Überprüfung Authentifizierung und Umleiten von Gästen ist ein gutes Beispiel. Controller enthalten stattdessen eine Logik, die für bestimmte Routen/Aktionen spezifisch ist - Sie könnten dafür Middleware verwenden, aber Sie würden separate Middleware für die Logik jeder Route benötigen und es würde alles sehr unordentlich werden.

Richtlinien/Fähigkeiten sind einfach eine Möglichkeit, Benutzerberechtigungen zu überprüfen - Sie können sie von einem Controller oder von Middleware oder anderswo abfragen. Sie geben nur wahr oder falsch zurück, also sind sie nicht gleichzusetzen mit Controllern oder Middleware. Die meiste Zeit werden Fähigkeiten einen Benutzer mit einem anderen Modell vergleichen, das basierend auf einer Kennung geladen wurde, die an eine Controller-Aktion gesendet wurde, aber es gibt wahrscheinlich auch Anwendungen für die Verwendung mit Middleware.

25

Ich gehe gerade durch einen kleinen Refactor mit meinen Rollen, Berechtigungen und Routen und stellte mir die gleiche Frage.

Auf der Oberflächenniveau scheint es wahre Middleware und Richtlinien führen die gleiche allgemeine Idee. Überprüfen Sie, ob ein Benutzer tun kann, was er tut.

Als Referenz ist hier die Laravel docs ...

Middleware "Darf ich das sehen? Darf ich hier gehen?"

HTTP-Middleware bietet einen bequemen Mechanismus zum Filtern von HTTP-Anfragen in Ihre Anwendung eingeben. Zum Beispiel enthält Laravel eine Middleware, die überprüft, ob der Benutzer Ihrer Anwendung authentifiziert ist. Wenn der Benutzer nicht authentifiziert ist, leitet die Middleware den Benutzer auf den Anmeldebildschirm um: . Wenn der Benutzer jedoch authentifiziert ist, lässt die Middleware die Anforderung weiter weiter in die Anwendung.

Natürlich kann zusätzliche Middleware geschrieben werden, um eine Vielzahl von Aufgaben neben der Authentifizierung durchzuführen . Eine CORS-Middleware könnte verantwortlich für das Hinzufügen der richtigen Header zu allen Antworten sein Ihre Anwendung verlassen. Eine protokollierende Middleware protokolliert möglicherweise alle eingehenden Anforderungen in Ihrer Anwendung.

https://laravel.com/docs/master/middleware#introduction

In meiner Lektüre ist Middleware über auf Antrag Ebene. In den Bedingungen von "Kann dieser Benutzer eine Seite sehen?" Oder "Kann dieser Benutzer hier etwas tun?"

Wenn ja, geht es zu der Controller-Methode, die dieser Seite zugeordnet ist. Interessanterweise könnte Middleware sagen: "Ja, du darfst dorthin gehen, aber ich werde aufschreiben, dass du gehst." Etc.

Sobald es fertig ist. Es hat keine Kontrolle mehr oder sagt, was der Benutzer tut. Eine andere Art, wie ich es als Middleperson denke.

Richtlinien "Kann ich das tun? Kann ich das ändern?"

Neben der Box heraus Authentifizierungsdienst bereitstellt, Laravel bietet auch eine einfache Möglichkeit, Berechtigungslogik und steuert den Zugriff auf Ressourcen zu organisieren. Es gibt eine Vielzahl von Methoden und Helfer, die Ihnen helfen, Ihre Autorisierungslogik zu organisieren, und wir werden jeden von ihnen in diesem Dokument behandeln.

https://laravel.com/docs/master/authorization#introduction

Richtlinien scheinen jedoch mehr betroffen zu sein mit tun. Kann der Benutzer einen Eintrag aktualisieren oder nur ihren?

Diese Fragen scheinen für eine Controller-Methode geeignet zu sein, in der alle Handlungsaufforderungen für eine Ressource organisiert sind. Rufen Sie dieses Objekt ab, speichern oder aktualisieren Sie den Artikel.

Als tjbb mentioned kann Middleware Routen sehr unordentlich und schwer zu verwalten machen. Dies ist ein Beispiel aus meiner Routen-Datei:

Das Problem

Route::group(['middleware' =>'role:person_type,person_type2',], function() { 
     Route::get('download-thing/{thing}', [ 
      'as' => 'download-thing', 
      'uses' => '[email protected]' 
     ]); 
    }); 

Das wird sehr schwer in meiner Route-Datei zu lesen!

Ein anderer Ansatz mit Politik

//ThingController 
public function download(Thing $thing) 
{ 
    //Policy method and controller method match, no need to name it 
    $this->authorize($thing); 

    //download logic here.... 
} 
+0

Was macht 'as' => 'download-thing'? Ich habe das Gefühl, dass es so etwas wie "agiere als dieses Modell bei der Verarbeitung des Rests dieser Anfrage" macht. Ich versuche, eine Dokumentation darüber zu finden, aber bisher kein Glück. edit: Ich habe es gefunden. Sie können eine Route "benennen", um die Benutzerfreundlichkeit beim Generieren einer URL oder beim Umleiten des Benutzers zu erhöhen. Viel weniger nützlich für mich :( – daraul

+0

Große Antwort! Ein weiterer Vorteil der Richtlinie ist, dass Sie es in Ihren Blade-Vorlagen mit dem Befehl "can" verwenden können. – Adam