[Résolu] [Résolu] Connexion automatique (NTLM)

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

J'écris ce ticket pour demander de l'aide. En effet je développe un module pour mon Intranet qui gère la création de compte automatique ainsi que la connexion.

J'ai fini de développer la partie de création de compte (ajout dans la table users), cette création de compte se fait automatiquement via un script, le nom d'utilisateur est la variable $_SERVER['REMOTE_USER'] et le rôle par défaut est utilisateur authentifié.

Hors j'aimerai bien qu'à la fin de ce script, l'utilisateur soit logué, mais je ne trouve pas comment faire, j'ai bien essayé d'utiliser la fonction user_login_finalize(); mais sans succès ainsi que de passer par un user_load('user.uid') mais en vain.

Si quelqu'un à déjà eu à faire à ce genre de contraintes, je suis preneur !

N'hésitez pas à poser des questions si vous n'avez pas tout bien saisie, merci !

EDIT : Après quelques bricolages, j'ai trouvé une pistes intéressante sur les variables de sessions, mais je ne sais pas comment elles sont gérées au sein de drupal et quand la session est démarrée (au début de chaque page.tpl.php, ou une fois, ..)
Toujours en attente d'aide :)

Forum : 
Version de Drupal : 

Bonjour à tous, je me répond vu que j'ai trouvé la solution !

En gros, si dans le futur d'autre personnes auront à développer un Intranet avec une gestion des utilisateurs via leur identifiant windows : (Testé sous XAMPP)

1 - Configurer apache de façon à ce que la variable $_SERVER['REMOTE_USER'] soit initialisée. cf tuto : Suivre le tuto pour mod_authn_ntlm.so

2 - Une fois cela fait, à l'étape du fichier php WhoIAm.php vous devriez avoir la variable remote_user qui s'affiche avec votre identifiant Windows.
Sinon, vérifié votre httpd.conf, ça devrait ressembler à ça :

<Directory "c:/xampp/htdocs/intranet/" >
#AllowOverride None
AuthName "Private location"
AuthType SSPI
NTLMAuth On
NTLMAuthoritative On
<RequireAll>
    <RequireAny>
        Require valid-user
        #require sspi-user EMEA\group_name
    </RequireAny>
    <RequireNone>
        Require user "ANONYMOUS LOGON"
        Require user "NT-AUTORIT?\ANONYMOUS-ANMELDUNG"
    </RequireNone>
</RequireAll>
# use this to add the authenticated username to you header
# so any backend system can fetch the current user
# rewrite_module needs to be loaded then
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
RequestHeader set X_ISRW_PROXY_AUTH_USER %{RU}e
</Directory>

3 - Pour la suite, je vous conseil de développer un petit module permettant de créer automatiquement un utilisateur dans la base de données

$remote_user_infos = array(
      'name' => $remote_user, //Le nom de l'utilisateur sera égal à son identifiant windows
      'pass' => $lemotdepasse, // Défini un mot de passe pour l'utilisateur
      'status' => 1, // Si le status est à 1 : autorise l'accès au site par l'utilisateur
      'roles' => array(
        DRUPAL_AUTHENTICATED_RID => 'authenticated user', // Rôle donné par défaut au nouvel utilisateur
      ),
      'access' => REQUEST_TIME,
      'timezone' => 'Europe/Paris',
    );

    /*user_save($account, $edit = array(), $category = 'account')
     *
     * $account : nom de compte, paramètre optionnel, si NULL création de nouveau compte
     * $edit : tableau contenant les informations de l'utilisateur (içi $remote_user_infos)
     * $category : categorie pour stocker les info du profil, paramètre optionnel
     */
    $account = user_save(NULL, $remote_user_infos);

4 - Effectuer une requête pour récupérer l'uid de l’utilisateur fraichement crée (requête sur la table user, champ uid, condition user.name = $remote_user). Une fois cela fait, il suffit de finaliser la connexion utilisateur :

if ($uid = user_authenticate($remote_user, $pass)) {
      global $user; //Définition de la variable utilisateur
      $user = user_load($uid); // On la peuple avec les données présente en base de donnée pour l'utilisateur ayant l'uid courrant

      $login_array = array ('name' => $remote_user); //On remplit un tableau avec le nom de l'utilisateur afin de passer ce tableau à user_login_finalize()
      user_login_finalize($login_array); // Méthode pour finaliser l'authentification utilisateur
    }

5 - On peut rajouter une redirection après cette opération fini

header('Location: /nom_de_votre_intranet/page_que_vous_voulez');
    exit(); // on arrête le script ici -> le visiteur est redirigé vers le home

N'hésitez pas à critiquer ce code, c'est surement pas la meilleur façon de faire mais je ne suis pas un expert Drupal ;)

Bonne journée !