Grundlegendes zur Sitzungsverwaltung und Benutzerauthentifizierung von Drupal

16

Ich habe eine Anforderung, bei der ich die Standardbenutzerauthentifizierung durch die Authentifizierung eines zentralen Servers, dh eines SSO-Servers, ersetzen muss.
Durch das Debuggen von Drupal wurde mir klar, dass die gesamte Sitzungsverwaltung in einer includes/session.incDatei stattfindet. Ich möchte die Authentifizierung wie im Bild gezeigt durchführen:

schnappen

SZENARIO: Login
Die Details der Schritte wären:

  1. Ersetzen Sie das Anmeldeformular, um den Benutzernamen und das Kennwort an den SSO-Server zu senden ( nicht auf Drupal , sondern auf .NET).
  2. Authentifizieren Sie den Benutzer auf dem SSO-Server mithilfe der Datenbank dieser Site. und senden Sie eine Antwort an eine benutzerdefinierte PHP-Seite meiner Website (oder ein Formular von einem Modul?).
  3. Identifizieren Sie anhand der Antwort den Benutzer in der Benutzertabelle und erstellen Sie eine Sitzung für diesen Benutzer, ohne nach dem Kennwort zu suchen (da dies eine doppelte Authentifizierung bedeuten würde). Standardmäßig legt Drupal ein Cookie mit dem $insecure_session_nameVariablennamen und dem Wert fest $sid. Ich möchte, dass Drupal das Cookie hier nicht setzt, sondern die Werte der Variablen an den SSO-Server sendet.
  4. Der SSO-Server übernimmt die Werte, erstellt ein Cookie und legt es in der Hauptdomäne ab domain.com(um beide zu erinnern, my websiteund sso serverbefindet sich in der Unterdomäne der Hauptdomäne, die ebenfalls nicht in Drupal enthalten ist). Dann kann sich die Drupal-Site mit diesem Cookie anmelden.

Ich weiß, es ist eine schwierige Frage. Ich suche nur nach Hinweisen, wie ich anfangen soll. wie sie sagen "Sie sollten den Kern nicht hacken". Meine Fragen lauten also:

  1. Wo sollte ich nachsehen, um zu verstehen, wie Drupal-Authentifizierung und Sitzungsverwaltung im Detail funktionieren?
  2. Gibt es eine Möglichkeit, die Funktionen mit includes/session.incHilfe von Hooks aufzurufen (wie in den Kommentaren mit Funktionen steht "nur für den internen Gebrauch / nicht zu ändern")?

HINWEIS: Der Benutzer wird auf dieselbe Weise registriert, sodass der Datensatz in der zentralen Datenbank des SSO-Servers verbleibt. Und währenddessen wird ein Junk-Passwort für denselben Benutzer in die Datenbank der Drupal-Site eingegeben (da das Passwort während der Anmeldung nicht überprüft wird).

Ajits
quelle
Benötigen Sie eine echte einmalige Anmeldung (Anmeldung an einer Site und Anmeldung an allen Sites) oder müssen Sie sich nur bei einem externen System authentifizieren?
mpdonadio
@MPD Ich möchte ein echtes SSO, bei dem Sie sich an einer Site anmelden und -> denselben Benutzer auf allen Sites authentifizieren müssen (möglicherweise nicht auf Drupal).
AjitS
@ Ajits Wenn Sie dies erfolgreich implementiert haben, können Sie bitte detaillierte Antwort setzen. Ich benutze user_login_finalize, aber ich werde aufgrund von GDPR-Problemen darauf hingewiesen, dass ich die Details nicht in Drupal speichern kann.
Jignesh Rawal

Antworten:

17

Drupal unterstützt die externe Authentifizierung . Es gibt viele alternative Authentifizierungsmodule für Drupal, wie OpenID (im Core enthalten), OAuth Connector oder LDAP . Erfahren Sie mehr über die Funktionsweise der Drupal-Authentifizierung. Am besten schauen Sie sich die OpenID- und OAuth-Module an und senden Sie den Rückruf an das Hauptanmeldeformular. Aber, AFAIK, sie starten immer die normale Drupal-Sitzung nach einer erfolgreichen Authentifizierung.

Für die Sitzungsverwaltung bindet sich Drupal in die PHP-Sitzungsverwaltung ein und registriert eigene Handler. Das Drupal-Sitzungs-Backend ist selbst steckbar. Sie können die session_incVariable auf den Pfad einer Datei setzen, um alternative Implementierungen der in enthaltenen Funktionen bereitzustellen includes/session.inc. Das Memcache- Modul verwendet dies, um die Sitzung im Memcache zu speichern.

Für Referenzen behandelt das OpenID-Modul die erfolgreiche Authentifizierung, in openid_authentication()der es selbst den Submit- Handler des Benutzeranmeldeformulars aufruftuser_login_submit() . Dieser Submit-Handler selbst ist einfach, er lädt den erfolgreich authentifizierten Benutzer mit user_load()in die globale $userVariable, ruft dann user_login_finalize()die behandelte Sitzung auf, meldet sich mit einem Zeitstempel in der userTabelle an und ruft hook_user_login()Implementierungen auf.

Eine weitere Option ist die Verwendung der user_external_login_register()Funktion. Die Funktion meldet einen externen Benutzer an. Bei Bedarf wird auch ein lokaler Benutzer erstellt. Wenn Sie mehr Kontrolle über lokale Benutzererstellung benötigen, können Sie immer verwenden user_save(), user_set_authmaps(), user_login_submit()und user_external_load()von Ihnen individuellen rufen, indem user_external_login_register()als Vorlage von dem, was getan werden muss.

Pierre Buyle
quelle
2
Das ist ziemlich genau richtig. Die Drupal-Seite der Anmeldung externer Benutzer ist überraschend einfach. Das schwere Heben (falls vorhanden) ist tatsächlich mit dem externen System verbunden.
mpdonadio
@MPD In meinem speziellen Fall das Gegenteil feststellen. Externes System = JSON-Webservice = relativ einfaches Zeug. Drupal-Verhalten = unvorhersehbarer Wechsel von Version zu Version = verdammt schwierig und keine nützliche Diagnose, wenn die Dinge kaputt gehen.
Trejkaz
1

user_authenticate () APi könnte sich hier als nützlich erweisen.

3. Identifizieren Sie mithilfe der Antwort den Benutzer in der Benutzertabelle und erstellen Sie eine Sitzung für diesen Benutzer, ohne nach dem Kennwort zu suchen (da dies eine doppelte Authentifizierung bedeuten würde). Standardmäßig legt Drupal ein Cookie mit dem $insecure_session_nameVariablennamen und dem Wert fest $sid. Ich möchte, dass Drupal das Cookie hier nicht setzt, sondern die Werte der Variablen an den SSO-Server sendet.

BEARBEITEN: Sobald der SSO-Server mit true zurückgekehrt ist, können Sie mit dieser API den Benutzer anmelden, der die Sitzungen automatisch für Sie erledigt. Ich denke, es ist besser, wenn Sie verwenden, user_authenticate()anstatt Sitzungen selbst zu erstellen. Es sollte kein Problem geben, auch wenn es sich um eine doppelte Authentifizierung handelt, solange ein gültiges p-assowrd angegeben wird.

Bin nicht sicher, ob 4. Soll das Cookie in beiden Domains sichtbar sein? Wenn ja, dann initialisiere in settings.php $cookie_domaindie Domain. Dann werden Cookies auf der Unterwebsite auf der übergeordneten Website verfügbar sein.

GoodSp33d
quelle
danke für Ihre Antwort. Ich kann es nicht verwenden, user_authenticateda die Authentifizierung nicht auf der Drupal-Site erfolgen muss. Ich kann die Sitzung durch Aufrufen drupal_session_generate()und drupal_session_regenerate()aus der Datei session.inc generieren. Sie haben es richtig verstanden, was das Erfordernis von Cookies angeht. Bitte lesen Sie die Bearbeitung.
Ajits
@indrock Überprüfen Sie diesen Link. Mit User_authenticate können Sie sich bei einem Benutzer anmelden, sofern Benutzername und Passwort korrekt sind. Wenn Sie in Schritt 3 überprüfen, ob Benutzername und Passwort auf dem SSO-Server korrekt sind, verwenden Sie diese API, um den Benutzer anzumelden. Aber Sie sollten das Passwort auf Drupal gespeichert haben. Dadurch wird es viel einfacher, als den Kern zu hacken.
GoodSp33d