2017-11-27 2 views
2

Ich habe ein Problem mit Laravel Auth-Modul.Auth für mehrere Benutzer Tabellen

Ich umschreibe altes Werkzeug zu Laravel aber muss alte System DB Struktur behalten.

System verwendet mehrere DBs (getrennt nach Abteilung) und erkennt, welche DB von der URL verwendet werden soll, z.

www.example.com/foo //use foo DB for foo department 
www.example.com/bar //use bar DB for bar department 

Foo und Bar DB haben ihre eigenen Benutzer Tabelle. Es gibt einige Konten, die in beiden Datenbanken vorhanden sind, aber unterschiedliche IDs haben, der Benutzername ist derselbe. Beispiel:

//foo DB users table 
ID username 
1 xyz 
2 abc 

//bar DB users table 
ID username 
1 qwe 
2 xyz 

Lassen Sie uns sagen, dass ich System foo deparment bin angemeldet in (und DB) als Benutzer xyz (id 1).

Ich wechsle jetzt zu Bar-Abteilung (und Bar DB).

Als Ergebnis bin ich in der Bar-Abteilung (und DB) als Benutzer qwe angemeldet, weil System ID (1), auf dem ich mich in das System eingeloggt habe, behalten.

Wie ändert man dieses Verhalten und zwingt das System, Benutzernamen anstelle von ID als Schlüssel zu verwenden, um Benutzer zwischen DBs zu indefinieren?

Ich weiß, dass ich username als Primärschlüssel in Benutzer-Modell verwenden können, aber dann muss ich alle Beziehungen ändern sich mit Benutzermodell verbunden und auch andere Dinge wie Auth :: id() usw.

Gibt es jeder leichtere Weg?

Antwort

0

Auth Wachen beziehen sich auf die Benutzer-ID-Feld auf diese Weise: $user->getAuthIdentifier())

So könnte man das Modell in Ihrer Benutzer tun:

class User extends Model { 
... 

    public function getAuthIdentifier() { 
    return $this->username; 
    } 
} 

Wenn Sie Auth Angst haben :: id() Änderungen, haben einen Blick auf sie Implementierung ist für die Sitzungs guard:

public function id() 
{ 
    if ($this->user()) { 
     return $this->user()->getAuthIdentifier(); 
    } 
} 

Update:

Aber Ihre beste Lösung, um Probleme mit benutzerdefinierten Autorisierungen zu lösen, ist die Verwendung Ihres eigenen Anwenders und Auth Guard.

Es klingt vielleicht schwierig, aber es ist so einfach wie die Implementierung von zwei Schnittstellen. Überprüfen Sie die offizielle Dokumentation hier here und here. Als ein Beispiel können Sie vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php verwenden (haben Sie einen guten Blick auf seine Helfereigenschaft GuardHelpers übrigens) und vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php