2015-04-13 8 views
10

Wäre es ratsam, wenn ich Authentifizierung in einer Middleware mache und einige Daten zum Objekt hinzufüge und diese Daten in der Steuerung durch Injektion in die Controller-Methode verwendet ?Ist es ratsam, Anwendungsdaten an Request in Laravel zu senden 5

Der Grund, dass die App einen Datenbankaufruf durchführen muss, um herauszufinden, ob die Berechtigungsnachweise gültig sind, und wenn dies der Fall ist, gibt sie etwas wie einen Primärschlüssel zurück, den ich in nachfolgenden db-Vorgängen verwende.

Im Moment wird alles in der Steuerung erledigt. Wenn ich eine separate Middleware für die Authentifizierung verwenden möchte, kann ich die Daten, die mein Controller benötigt, an das Anfrageobjekt binden, wenn die Middleware-Prüfung bestanden wird? Wenn ja, wie soll ich das machen?

Inspiration - Expressjs Weg der Bindung und Weitergabe von Daten entlang der Anfrage durch einen Stapel von Middlewares/Routen.

Antwort

2

Ja, das ist wahrscheinlich ein guter Weg, das eingebaute Laravel-Authentifizierungssystem funktioniert genauso: Sie können auf einen angemeldeten Benutzer über $request::user() zugreifen. Siehe http://laravel.com/docs/5.0/authentication#retrieving-the-authenticated-user

+0

Nur weil Sie mit 'user()' auf den aktuellen Benutzer zugreifen können, heißt das nicht, dass er im Anfrageobjekt gespeichert ist. – lukasgeiter

+0

@ Jeroen - Denken Sie nicht Laravel bindet es an Anfrage –

+0

Sie sind beide richtig, danke für Ihre Kommentare. Es war kein sehr starkes Argument. Aber ich denke immer noch nicht, dass es sehr schlechtes Design ist. –

6

Ich verstehe nicht - warum verwenden Sie nicht einfach den Laravel-Authentifikator?

Sie sagen:

Der Grund muss die App eine Datenbank Anruf tätigen, um herauszufinden, ob die Anmeldeinformationen gültig sind, und wenn es ist, gibt es so etwas wie einen Primärschlüssel, die ich in der folgenden db verwenden Operationen.

Und genau das macht der Laravel Authenticator?

in Ihrem Controller Dann können Sie

`auth()->user()` // gives you the user record 
`auth()->id()` // user_id from the DB 
`auth()->user()->name` // gives you the `name` column off the record. You can change it to anything. 

bearbeiten tun nur: In der Zwischenzeit - Sie können immer noch das Laravel Authenticator-Paket, während mit einem Legacy-System zur Authentifizierung verwenden. In Ihrer Middleware können Sie etwas tun:

if (doLegacyCheckHere()) { 
     Auth::loginUsingId(1); 
} 

Dies bedeutet, dass Sie Ihren Scheck über die Neo4j Graph db tun kann - und wenn es true zurückgibt, dass der Benutzer korrekt authentifiziert ist - dann melden Sie sich einfach in sie in die Laravel System selbst.

+0

Ich wollte es auf Anfrage anhängen, da ich wollte, dass meine Middlewares keine Vorkenntnisse über den Stack haben. Oder liege ich falsch, wenn ich das machen will? –

+0

Aber warum willst du das? Ich verstehe immer noch nicht? Sie benutzen das Laravel-Framework - also verstehe ich nicht, warum Sie nicht den Laravel-Authenticator verwenden, statt Ihren eigenen zu rollen? (Es kann einen triftigen Grund geben - aber wenn wir nicht wissen, warum - ist es schwierig, Ihre Frage zu beantworten) – Laurence

+0

Gründe - apikeys verwenden, um Anforderungen zu validieren, die eine Legacy-Neo4j-Graph-Datenbank verwenden, an der ich keine Änderungen vornehmen kann. –

1

Es ist in Ordnung, auth in der Middleware zu validieren. In meiner Anwendung verwenden wir dieselbe Funktionalität, um zu überprüfen, ob der Benutzer den richtigen access_code für den Zugriff auf die API-Methoden sendet. Selbst Laravel selbst behandelt geschützte Routen durch Authenticate Middleware.

Das Problem ist, gibt es keine Silberkugel, wie oder wo zusätzliche Daten zu speichern.

Eine Methode besteht darin, dies in der Benutzersitzung zu speichern.

Die zweite ist Illuminate\Foundation\Application Klasse selbst zu verwenden. Sie können es in Ihre Middleware __constructor() injizieren und damit Ihre Daten speichern. Application class extends Die Container-Klasse, die die ArrayAccess-Schnittstelle implementiert, mit der Sie auf ihre Eigenschaften wie auf ein Array zugreifen können. Dadurch können Sie nicht nur Variablen aus der Anwendung abrufen, sondern diese auch speichern. Nicht der beste Weg, obwohl der einfachste.

public function __construct(\Illuminate\Foundation\Application $app) 
{ 
    $app['_foo'] = 'bar'; 
} 

Es gibt mehr solche Hacks, aber diese sind die einfachsten.

Verwandte Themen