J'ai une exigence où, je dois remplacer l'authentification utilisateur par défaut par l'authentification d'un serveur central, c'est-à-dire un serveur SSO.
En déboguant Drupal, j'ai appris que toute la gestion des sessions se faisait en includes/session.inc
fichier. Je veux faire l'authentification comme indiqué dans l'image:
SCÉNARIO: Connexion
Les détails des étapes seraient:
- Remplacez le formulaire de connexion pour soumettre le nom d'utilisateur et le mot de passe au serveur SSO ( pas sur Drupal , mais sur .NET).
- Authentifier l'utilisateur sur le serveur SSO en utilisant la base de données de ce site; et envoyer une réponse à une page PHP personnalisée de mon site Web (ou un formulaire par un module?).
- À l'aide de la réponse, identifiez l'utilisateur dans le tableau des utilisateurs et créez une session pour cet utilisateur sans vérifier le mot de passe (car cela signifierait une double authentification). Par défaut, Drupal définit un cookie avec un nom de
$insecure_session_name
variable et une valeur$sid
. Je veux que Drupal ne place pas le cookie ici, envoie plutôt les valeurs des variables au serveur SSO. - Le serveur SSO prendra les valeurs, créera un cookie et le déposera dans le domaine principal
domain.com
(pour rappeler les deuxmy website
et sesso server
trouve sur le sous-domaine du domaine principal, qui n'est pas non plus dans Drupal). Ensuite, le site drupal peut se connecter en utilisant ce cookie.
Je sais que c'est une question difficile, je cherche juste des conseils sur la façon de commencer? comme ils disent "vous ne devriez pas pirater le noyau". Donc, mes questions sont:
- Où dois-je chercher pour comprendre comment l'authentification Drupal et la gestion de session fonctionnent en profondeur?
- Existe-t-il un moyen d'appeler les fonctions en
includes/session.inc
utilisant des hooks (comme le dit le commentaire avec les fonctions "pour usage interne uniquement / à ne pas modifier")?
REMARQUE: je vais utiliser la même méthode pour enregistrer l'utilisateur, afin que l'enregistrement reste dans la base de données centrale du serveur SSO. Et pendant cela, un mot de passe indésirable sera inséré pour le même utilisateur dans la base de données du site Drupal (car le mot de passe ne sera pas vérifié lors de la connexion).
Réponses:
Drupal prend en charge l'authentification externe . Il existe de nombreux modules d'authentification alternatifs pour Drupal, tels que OpenID (inclus dans le noyau), OAuth Connector ou LDAP . En savoir plus sur le fonctionnement de l'authentification Drupal; le mieux serait de regarder les modules OpenID et OAuth, et de renvoyer le formulaire de connexion principal. Mais, AFAIK, ils démarrent toujours la session Drupal normale après une authentification réussie.
Pour la gestion des sessions, Drupal se connecte à la gestion des sessions PHP et enregistre ses propres gestionnaires. Le backend de session Drupal est lui-même enfichable, vous pouvez définir la
session_inc
variable sur le chemin d'un fichier fournissant des implémentations alternatives des fonctions trouvées dansincludes/session.inc
. Le module memcache l' utilise pour stocker la session dans memcached.Pour les références, le module OpenID gère l'authentification réussie dans
openid_authentication()
laquelle lui-même fonctionne et appelle le gestionnaire de soumission du formulaire de connexion utilisateur (c'est-à-dire.user_login_submit()
). Ce gestionnaire de soumission lui-même est simple, il charge l'utilisateur authentifié avec succèsuser_load()
dans la$user
variable globale , il appelle ensuite lauser_login_finalize()
session de gestion, l'horodatage de connexion dans lauser
table et l'invocation deshook_user_login()
implémentations.Une autre option est d'utiliser la
user_external_login_register()
fonction. La fonction connecte un utilisateur externe. Elle crée également un utilisateur local si nécessaire. Si vous avez besoin d'un plus grand contrôle sur la création d'utilisateur local, vous pouvez toujours utiliseruser_save()
,user_set_authmaps()
,user_login_submit()
etuser_external_load()
de vous appeler sur mesure, en utilisantuser_external_login_register()
comme modèle de ce qui doit être fait.la source
user_authenticate () APi pourrait être utile ici.
EDIT: Une fois que le serveur SSO revient avec vrai, utilisez cette API pour vous connecter à l'utilisateur qui s'occupera automatiquement des sessions pour vous. Je pense que c'est mieux si vous utilisez
user_authenticate()
au lieu de créer des sessions par vous-même. Cela ne devrait pas poser de problème, même si c'est une double authentification tant que p-assowrd valide est fourni.Je ne suis pas sûr de 4. Voulez-vous que le cookie soit visible dans les deux domaines? Si c'est le cas, dans settings.php, initialisez
$cookie_domain
le domaine. Ensuite, les cookies du sous-site seront disponibles sur le site parent.la source
user_authenticate
car, l'authentification n'a pas besoin de se produire sur le site Drupal. Je peux générer la session en appelantdrupal_session_generate()
et àdrupal_session_regenerate()
partir du fichier session.inc. Vous avez bien compris l'exigence de cookie .. veuillez consulter la modification.