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.inc
Datei stattfindet. Ich möchte die Authentifizierung wie im Bild gezeigt durchführen:
SZENARIO: Login
Die Details der Schritte wären:
- Ersetzen Sie das Anmeldeformular, um den Benutzernamen und das Kennwort an den SSO-Server zu senden ( nicht auf Drupal , sondern auf .NET).
- 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?).
- 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_name
Variablennamen 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. - Der SSO-Server übernimmt die Werte, erstellt ein Cookie und legt es in der Hauptdomäne ab
domain.com
(um beide zu erinnern,my website
undsso server
befindet 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:
- Wo sollte ich nachsehen, um zu verstehen, wie Drupal-Authentifizierung und Sitzungsverwaltung im Detail funktionieren?
- Gibt es eine Möglichkeit, die Funktionen mit
includes/session.inc
Hilfe 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).
Antworten:
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_inc
Variable auf den Pfad einer Datei setzen, um alternative Implementierungen der in enthaltenen Funktionen bereitzustellenincludes/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 mituser_load()
in die globale$user
Variable, ruft dannuser_login_finalize()
die behandelte Sitzung auf, meldet sich mit einem Zeitstempel in deruser
Tabelle an und rufthook_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 verwendenuser_save()
,user_set_authmaps()
,user_login_submit()
unduser_external_load()
von Ihnen individuellen rufen, indemuser_external_login_register()
als Vorlage von dem, was getan werden muss.quelle
user_authenticate () APi könnte sich hier als nützlich erweisen.
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_domain
die Domain. Dann werden Cookies auf der Unterwebsite auf der übergeordneten Website verfügbar sein.quelle
user_authenticate
da die Authentifizierung nicht auf der Drupal-Site erfolgen muss. Ich kann die Sitzung durch Aufrufendrupal_session_generate()
unddrupal_session_regenerate()
aus der Datei session.inc generieren. Sie haben es richtig verstanden, was das Erfordernis von Cookies angeht. Bitte lesen Sie die Bearbeitung.