Erzwinge, dass Laravel einen Benutzer mit der Legacy-Authentifizierung anmeldet

8

Ich versuche, Laravel langsam in eine ältere PHP-Anwendung zu integrieren. Eine der Aufgaben besteht darin, eine Laravel-Benutzersitzung automatisch zu registrieren, wenn sich ein Benutzer bei der alten App anmeldet. Ich versuche nicht, die Laravel-Authentifizierung zu implementieren, sondern möchte lediglich die vorhandene Funktionalität aufheben und einen bestimmten Benutzer zwingen, sich einzuloggen, ohne die Anmeldedaten zu überprüfen. Was ich bis jetzt habe, wurde aus den Hacks anderer Leute, die ich gefunden habe, zusammengeschustert:

%Vor%

Danach bekomme ich einen laravel_session cookie, der Inhalt auf dem Client hat. Während der Login-Anfrage nach dem obigen Code, wenn ich dd(Auth::user()) , dann bekomme ich den Benutzer, bei dem ich mich gerade eingeloggt habe. Bei nachfolgenden Anforderungen geben Auth::user() und $this->request->user() jedoch null in allen Kontexten zurück.

Wie kann ich eine aktive Laravel-Benutzersitzung erzwingen, ohne dass sie tatsächlich authentifiziert wird, die für alle Anfragen bestehen bleibt?

Das Endergebnis ist, dass Laravel als eine "Unteranwendung" unterhalb der Legacy-App ausgeführt wird, während vorhandene Features einzeln nacheinander abgerufen werden, so dass beide für eine bestimmte Zeit existieren, bis alle Funktionen in Laravel und Es wird die vorhandene App vollständig ersetzen. Wenn es sinnvoller ist, zu versuchen, die Legacy-Authentifizierung mit Laravel zu übernehmen, als umgekehrt, bin ich dafür offen, aber ich würde lieber vermeiden, die zugrunde liegende Benutzertabelle ändern zu müssen (die Legacy-Authentifizierung findet über LDAP statt) Es gibt keine Passwörter lokal, es gibt kein remember_token, aber das ist einfach genug, wenn ich hinzufügen möchte. Ich suche wirklich nur den kürzesten Weg mit dem geringsten Aufwand / Kopfschmerz.

    
Jeff Lambert 23.03.2017, 16:37
quelle

4 Antworten

1

Dies ist ein wenig schwierig, da Laravel verschlüsselte Cookies verwendet, die von EncryptCookies Middleware verarbeitet werden. Sie können Ihren Code arbeiten, wenn Sie ihn deaktivieren, aber ich würde es nicht empfehlen.

Die Lösung besteht darin, Laravel EncryptCookies Middleware zu verwenden, um die Anfrage zu entschlüsseln und die Antwort zu verschlüsseln. Dadurch wird die von Ihrer Legacy-Authentifizierung erstellte Sitzung von Laravel gelesen.

Betrachten Sie dies als login.php-Datei, die $user_id benötigt, um den Benutzer per ID nach laravel zu loggen.

%Vor%

Innerhalb der Schließung von $encryptCookies->handle() können Sie die Anfrage nach der Entschlüsselung lesen und hier können Sie die Sitzung ändern. Und wenn Sie die Antwort zurücksenden, wird sie erneut verschlüsselt und Sie können sie dann an den Browser senden.

Um die Sitzung in einer anderen Datei zu lesen, können Sie Folgendes tun:

%Vor%     
Amr El-Naggar 29.03.2017, 09:29
quelle
1

Sie rufen save() nicht bei Session auf, weshalb Ihre Sitzung nicht fortbesteht. Ich habe die letzten Zeilen Ihres Codes wie folgt geändert:

%Vor%

Ich habe diesen Code kopiert und nur die $app['auth']->loginUsingId($user_id); -Zeile in eine zweite Datei kopiert und ausgeführt und der Dump zeigt denselben Benutzer an, der immer noch angemeldet ist. Das Abmelden und Entfernen der Zeile, die die Sitzung speichert, verhindert das Funktionieren. Hoffentlich ist dies die Lösung, nach der Sie gesucht haben.

    
Markus Tenghamn 28.03.2017 14:47
quelle
1

Ich würde vorschlagen, dass es sich lohnt, Laravel als die Haupt-App zu betrachten, die eine Weitergabe an den Legacy-Code für Routen ermöglicht, die Sie noch nicht konvertiert haben. Ich tat dies mit einer riesigen Legacy-App, die alles hatte, was man von einer App, die vor 10 Jahren geschrieben wurde, erwarten würde. Obwohl es alles zusammen machte, war am Anfang ein Problem (ähnlich wie bei den Problemen, aber umgekehrt), Als es fertig war, löschte ich nur alten Code, bis nichts mehr übrig war. Mit Ihrem Ansatz kann ich nicht sehen, was passieren wird, wenn es an der Zeit ist, den alten Code endgültig abzuschaffen.

Ich endete mit:

%Vor%

Ein OldController wurde eingerichtet mit:

%Vor%

Die alte / index.php musste Dinge tun wie:

%Vor%

Ich habe einige fragwürdige Dinge getan, indem ich Laravel auth und einen LegacyHasher für alte Passwörter in AuthController benutzt habe:

%Vor%

LegacyHasher (ja, hat es getan ...)

%Vor%

Und eine Ladung anderer Sachen, die hier weit über den Rahmen hinausgehen. Aber es ist machbar, wenn auch schmerzhaft. Nach einiger Zeit, in der ich daran gearbeitet habe, wurde der alte Code entfernt und ich habe eine komplette testbare Laravel App. Es hat ein paar hundert TODOs, die frei herum verstreut sind, aber es ist viel überschaubarer.

Ich bin glücklich, mit mehr Details zu helfen, wenn Sie sich dafür entscheiden, in diese Richtung zu gehen.

    
markdwhite 29.03.2017 08:59
quelle
1

Dies wird Ihre Laravel-Frage nicht direkt beantworten, aber Sie denken ein wenig über den Tellerrand hinaus, was Sie im Prinzip erreichen wollen, ist SSO (Single Sign-On).

Aus Gründen der Migration ist dies nur eine Overkill-Lösung. Wenn Sie jedoch planen, mehr miteinander verbundene Websites zu migrieren oder eine App zu entwickeln, sollten Sie darüber nachdenken.

Es gibt drei Optionen (wie üblich):

Wenn es sich um eine Bibliothek eines Drittanbieters handelt, kann ich den Aut0-Dienst empfehlen, der die Authentifizierungslast von Ihnen nimmt. Abhängig von der Anzahl der Benutzer kann es sogar als kostenlose Lösung kommen. Ich empfehle dies aufgrund meiner eigenen Erfahrung mit dem Service.

Mehr zu SSO

Auth0 SSO-Beispiel

    
lchachurski 29.03.2017 12:45
quelle