laravel und multi-sessions vom gleichen browser
In unserer web-app, Wenn ich einen einzigen browser, login, um unsere Anwendung als Benutzer Ein, öffnen Sie eine andere Registerkarte, und melden Sie sich als Benutzer B Benutzer A verliert seine session-Daten. Ich nehme an, dies ist durch einen gemeinsamen cookie sich mit der Benutzer-agent. Gibt es eine Möglichkeit, concat seinen Namen mit einem Benutzernamen? so, die sessions können co-existieren zwischen gleichzeitige angemeldete Benutzer mit dem gleichen browser auf dem gleichen Rechner?
Verwenden wir Laravel 5. Gibt es eine Möglichkeit, um es?
- Können Sie mehr Details, warum Sie benötigen mehrere Benutzer-log-in auf verschiedenen tabs? Ist es nur für die Prüfung? Menschen, die einen computer gemeinsam?
- Einige Benutzer anmelden können mehrere Arten von Konten, die Sie haben in unseren Anwendungen. Einige wählen, um es in der gleichen Browser. Daher das problem.
- Wenn Sie zulassen, kann die Einschränkung, dass ein Benutzer sich anmelden können, bei den meisten ist nur ein account pro Typ, dann denke ich, das wird ein problem einfacher.
- Verwenden Sie den Inkognito-Modus?
- Siehe meine Antwort auf, die nur mit session-ID in der url. die verlinkten code-sperren, IP-und browser-agent zum Umgang mit Sicherheitsrisiken.
- Ich plötzlich erkennen, dass meine Antwort nicht mit deiner Frage! Ihre Frage ist über verschiedene Benutzer in verschiedenen tab eines Browsers. Ich denke, dies ist nicht über die server-Seite sein, weil eine Sitzung nicht verwendet durch mehr als einen Benutzer. Ich denke, wir können so etwas wie
Token
aber nicht wirklich php seesion Anlage zu nähern, die!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laravel Sitzung Hintergrund
Sitzungen
Überspringen Sie diesen Abschnitt für eine schnelle und einfache Lösung
In Laravel, session-cookies werden erstellt über die
Illuminate\Session\SessionManager
Klasse, nämlich durch diebuildSession
Methode:SessionManager::buildSession
In dieser Methode können wir deutlich sehen, dass der name der session kommt von unseren
config\session.php
, suchen insbesondere diese Zeile:session.php
Ok, aber das hilft nicht viel ändern, ändert es sich überall, wie erwähnt, von der Bemerkung ausgehend, die es in der config.
Und auch wenn wir nicht passieren konnten es einige dynamische Wert, so etwas wie:
Dies schafft ein Paradox, Zeit, Ende, Universum implodiert Ergebnis, denn Sie fordern die
id
von deruser
erreichbar über diesession
blickte durch diecookie
Namenlaravel_session
.. (mindblown)Lassen wir
SessionManager
und es istsession.php
Konfiguration allein. Wir sehen von oben, dass, egal wie wir es anpacken, alle unsere session-Daten fallen unter das einzigelaravel_session
- Taste.Guard
Vielleicht Wache wird etwas mehr Informationen.
Guard ist der Schlüssel für auth in Ihrer app, und eines der vielen Dinge, die macht Laravel genial für die schnelle Erstellung von Anwendungen.
Die Methode zu betrachten ist
Guard::user()
.Eines der ersten Dinge, die
Guard::user()
hat nach anfänglichen cache-und abgemeldet überprüfen, ist eine Sitzung zu überprüfen.Guard::user()
Also hier, Laravel ist das abrufen der session-Werte, die mit dem Ergebnis der
getName()
- genial - alles, was wir tun müssen, ist die modgetName()
einen Wert zurückgeben, nehmen Sie nahm an, dass die Methode:Guard::getName()
Das ist ziemlich straight-forward.
$this
bezieht sich auf die Guard-Klasse, so dass die md5-effektiv immer die gleiche (wenn jemand weiß, das 'warum' hinter md5 ' Ing der name der Klasse, das wäre das gleiche jedes mal, einen Kommentar hinterlassen).Gibt es ein paar Orte, wo das aktualisiert werden soll, wie
getRecallerName
.Also von hier aus können Sie erweitern den core
Guard
Klasse und splice in Ihrem getName und getRecallerName Methoden.Werden Sie wahrscheinlich wollen, wickeln Sie einige service-provider, um dieses schreiben von unit-tests, vielleicht sogar das original überschreiben auth-manager.
Finden Sie im nächsten Teil
Das schnelle "ich brauche nur eine Antwort" Antwort
Ollie Lesen hat bereits eine Lösung geschaffen, die Sie hier finden:
https://github.com/ollieread/multiauth
Ich Sie ermutigen, einen Blick zu haben, vor allem die custom
Guard
- Klasse, die erweitert die core -Guard
mit benutzerdefiniertengetName
Methoden.Alle großen browser speichern nur ein session-cookie wird für eine Website, aber die Website-Entwickler erhält zu wählen, was in diesem cookie. Es scheint, wie Ihre Website ist das speichern von Benutzer-Informationen in der session-cookie, die wird dann immer überschrieben, wenn die anderen Register speichert verschiedene Informationen in den Cookies.
Brauchen Sie nicht viel detail darüber, wie Ihr bestimmte Website betreibt, aber hier sind ein paar Allgemeine Möglichkeiten der Annäherung an dieses problem.
1) Verwenden Sie unterschiedliche Browser für verschiedene Benutzer. Die verschiedenen Browser nicht teilen cookies zwischen Ihnen. Wenn Ihr Ziel ist einfach, um zu testen Sie Ihre Website mit mehreren Benutzern, das ist der Weg. Sie können auch Incognito/Private Modus auf log-in einen separaten Benutzer, weil dieser Modus nicht teilen, cookies entweder.
2) nicht verwenden session-cookies zum speichern von Benutzerinformationen. Dies ist ein non-starter auf den meisten Webseiten, aber wenn dies ist eine interne Seite oder streng kontrollierten Umgebung, können Sie in der Lage sein, um pass user-Identifikation über die URL, POST-Daten, oder einige andere versteckte identifier in der Anfrage.
3) Speichern von Daten in das session-cookie für alle momentan angemeldeten Benutzer. Je nach web-framework, kann es möglich sein, eine Karte zu erstellen von
user
->cookieData
und look up die richtige Basis, auf der Benutzer die Anforderung stellt. Dies ist eine erweiterte Technik, und ich weiß wirklich nicht, wenn Laravel stellt dieses Niveau der Kontrolle.tl;dr: Yagni
Betrachten Sie eine person, die (http-client in deinem Fall) mit 2 Identitäten:
Dr Jekyll
undMr Hyde
.Er besucht seinen neuen Freund Sir
RM1970
(http-server in deinem Fall): "Wie tun Sie,RM1970
!".Hier ist das problem. Schlechte
RM1970
brauchen, willkommen zurück die monster, und es gibt wenige Optionen:Dr Jekyll
undMr Hyde
!", die unglaublich erschwert das weitere Gespräch (Ihre ACl, zum Beispiel, wird die Bedienung mit einer Liste der Identitäten, und eine Entscheidung über Prioritäten, wenn Sie in Konflikt realtime)Dr Jekyll
!" und beten Sie die richtige Wahl getroffen (zufällige Identität des Benutzers und bringen Sie Ihre Benutzer etwas Spaß mit unvorhersehbaren Reaktionen)Später ist, wie es tatsächlich funktioniert. Der browser bietet die neuesten bestätigten Identität.
Sie habe gebeten dies zu ändern, aber tun Sie es wirklich wollen? Halten Sie die line-und don ' T akzeptieren diese Verantwortung zu übernehmen.
Wenn Sie nicht mit den ersten 2 dead-end-Optionen, müssen Sie den Benutzer Fragen, auf welche Namen er sendet die Anfrage. Die beste option ist hier, um Ihre frontend-stateful, pflegen Liste der geöffneten Sitzungen, und bieten eine Benutzeroberfläche für die Nutzer zu pick. Es ist fast die 3. Ryan Bemrose ' s option, aber speichern diese Daten auf der client-Seite, und senden Sie nur den Auserwählten. Keine änderungen in laravel backend erforderlich.
Das problem ist hier, Schalt-Registerkarten werden nicht automatisch den Benutzer zu wechseln, und eher verwirrend, mit sehr wenig Unterschied mit logout/login-Pfad, der bereits umgesetzt wird.
Einige Browser unterstützen mehrere profile (Beispiel), die möglicherweise eine akzeptable alternative. Im Grunde ist es das gleiche wie 1. Ryan Bemrose ' s option, aber muss nicht, mehrere Browser installiert sind, und profitieren von der permanenten cookies, aka 'remember-me'.
Die einfachste ist nur ein URL-basierter sessionID, das könnte ein Sicherheitsproblem werden, je nachdem, wie Ihre Anwendung ist so konzipiert, vor allem, wenn sharing-urls mit nicht-abgelaufene Sitzungen.
Seit L5 nicht unterstützt native php-sessions mehr haben, müssen Sie die Verwendung eines benutzerdefinierten Anbieters wie folgt:
Wird dieser sessionID in die url laravel V5:
https://github.com/iMi-digital/laravel-transsid
Grundsätzlich die session-URL-basierte, so können Sie sich einfach nur einloggen in einen anderen tab und eine neue sessionID, und diese person leicht tun können, mit einer "open page in new tab", um zwei Seiten der gleichen Benutzer, wenn erforderlich.
Die Bibliothek oben sperrt die session an die IP und User-Agent-so link-sharing nicht versehentlich Auslaufen einer session.
Ich nicht genau weiß, was brauchen Sie für diese, aber als Entwickler habe ich manchmal, um sich bei einer Anwendung mit mehreren Benutzern. Zu tun, dass ich in der Regel verwenden Sie den Inkognito-Modus oder wenn Ihr mehr als 2 Benutzer, ich hatte etwas Glück mit diese Erweiterung in chrome.
Ich weiß, das ist nicht die Antwort auf deine Frage, aber es könnte nur sein, was Sie suchen.
Verschiedenen seesions Koexistenz zwischen konkurrierenden angemeldete Benutzer nicht einfach nur umgesetzt werden durch session-cookie,weil cookie gespeichert wird vom browser. Damit der angemeldete
in Benutzer-seesion, die gespeichert werden müssen, die von Server.
Wie wir alle wissen, Einmal
session_start
genannt wird,SessionID erstellt wird und dann die temp-Datei erstellt, in der server, temporäre- Verzeichnis.
Unterschiedliche Benutzer unterschiedliche SessionID und nach
session_destory
riefen dann alle Kennungen gespeichert in den Server und die Cookies wiederhergestellt werden. Schreiben Sie dieses Verhalten durch die Implementierung SessionHandlerInterface. Der verursachen, viele web-Frameworks unterstützen diese,Laravel hat, nicht die Ausnahme.Hier ist das Dokument:
custom-session-Treiber
Ich weiß nicht, wie kompliziert es ist, um code in laravel aber dies könnte eine Lösung:
Verwenden Sie eine unterschiedliche session-name muss ein string sein, und den code in die url jedes mal, damit die Anwendung weiß, welche Benutzer einen Antrag gestellt. So können Sie rufen Sie die session-Variablen von einem normalen Namen.
Multi userlogin mit dem gleichen browser wie google-Konto hinzufügen. dafür brauchen Sie einigen Schritten Folgen und re-schreiben auth-Bibliothek, die zur Verfügung gestellt von der Laravel,
Schritte