web-dev-qa-db-fra.com

Comment connecter par programmation un utilisateur?

Je recherche l'API qui me permettra de connecter un utilisateur en lui transmettant le nom d'utilisateur et le mot de passe. Est-ce que quelqu'un a de l'expérience avec ça?

Pour clarifier, j'essaie de créer une boîte de connexion AJAX qui apparaît comme une fenêtre contextuelle sur la page d'accueil, et ne rafraîchit pas la page en cas d'informations d'identification erronées, mais uniquement si la connexion est Voici donc ce que j'ai fait jusqu'à présent:

Mise à jour

Je charge maintenant le formulaire de connexion sur ma page d'accueil, puis lors de la soumission, je lance une AJAX qui envoie des informations d'identification à ce script:

function user_login_submit_try() {
  global $user;  

  $uid = user_authenticate($_POST['name'],$_POST['pass']);    
  $arr = array ('name'=>$_POST['name'],'pass'=>$_POST['pass']);
  if ($uid){
    $user = user_load($uid);
    user_login_finalize($arr);
  }

  echo drupal_json_encode($uid); 
  exit;
}; 

Jusqu'à présent, cela fonctionne, mais mes inquiétudes sont (comme mentionné par googletorp) des problèmes de sécurité; il semble qu'aucune des API que j'ai utilisées dans ce script n'ait de toute façon assaini les données.

Quelqu'un verrait-il une meilleure façon de le faire?

41
silkAdmin

Cela pourrait aider quelqu'un:

function mymodule_user_login_credentials($username, $password)
{
    if(user_authenticate($username, $password))
    {
      $user_obj = user_load_by_name($username);
      $form_state = array();
      $form_state['uid'] = $user_obj->uid;      
      user_login_submit(array(), $form_state);
      return true;
    }
    else
    {
        return false;
    }
}

Une meilleure version basée sur le commentaire:

function mymodule_user_login_credentials($username, $password)
{
    if($uid = user_authenticate($username, $password))
    {
      user_login_submit(array(), array('uid' => $uid));
      return true;
    }
    else
    {
        return false;
    }
}
33
user1750

Il n'y a pas de fonction API simple pour cela.

Vous pouvez faire ce que Drupal fait:

  1. Testez le mot de passe en interrogeant la base de données voir:

ser_login_name_validate ()
ser_login_authenticate_validate ()
ser_login_final_validate ()

  1. Remplacez le global $user.

    global $user;
    $user = user_load($uid);
    
  2. Séances de gestion

user_login_finalize($form_state);

Pour les étapes 2 et 3, voir user_login_submit()

Toutes ces fonctions sont basées sur l'appel depuis un formulaire. Le flux normal est que les gestionnaires de validation testent l'entrée des utilisateurs et renvoie l'uid de l'utilisateur si la validation réussit. Le gestionnaire de soumission gère ensuite la connexion réelle de l'utilisateur et le raccordement de l'utilisateur appelant.

19
googletorp

Si vous devez obtenir l'objet utilisateur pour le compte d'utilisateur pour lequel vous connaissez le nom d'utilisateur et le mot de passe, vous pouvez utiliser le code suivant:

function mymodule_get_user(name, $password) {
  $account = FALSE;

  if ($uid = user_authenticate($name, $password)) {
    $account = user_load($uid);
  }

  return $account;
}

$account sera FALSE si l'objet utilisateur ne peut pas être trouvé ou chargé.

Vous devez utiliser ce code lorsque, par exemple, votre module obtient le nom d'utilisateur et le mot de passe en entrée d'un utilisateur, il vérifie s'ils sont corrects, puis il fait quelque chose avec l'objet utilisateur.
Si vous écrivez un module qui doit usurper l'identité d'un utilisateur pour écrire un commentaire, ou faire quelque chose d'autre qui doit résulter comme fait par un utilisateur, c'est ce que le Suivi des problèmes du projet le module fait lors de la fermeture d'un rapport de problème qui a été dans l'état fixe pendant deux semaines (dans ce cas, il ajoute le commentaire "Fermé automatiquement - problème fixe pendant 2 semaines sans activité "(résultats écrits par l'utilisateur" Message système "), vous n'avez donc pas besoin de nom d'utilisateur et de mot de passe. Vous venez de charger l'objet utilisateur dont vous connaissez l'ID utilisateur.

Pour autant que je sache, il n'y a aucun problème de sécurité avec le code que j'ai signalé.
Vous pouvez souhaiter limiter le nombre de connexions ayant échoué; ou pour bloquer temporairement l'adresse IP qui tente de se connecter sans succès, ou essaie différentes connexions en peu de temps.

7
kiamlaluno

Ce code fonctionne vraiment

//login
$uid = user_authenticate($username, $password);
global $user;
$user = user_load($uid);    
//login finalize
watchdog('remote_user', 'Session opened for %name.', array('%name' => $user->name));
$user->login = REQUEST_TIME;
db_update('users')
  ->fields(array('login' => $user->login))
  ->condition('uid', $user->uid)
  ->execute();
drupal_session_regenerate();
3
vacho

Réponse nettoyée de ce qui précède. La vérification de l'utilisateur et du mot de passe est une fonctionnalité supplémentaire. En outre, le faux form_state doit être une variable à transmettre par référence à la fonction ou il génère une erreur.

Nous avons donc:

function mymodule_log_in_by_uid($uid) {
    $faux_form_state = array('uid' => $uid);
    user_login_submit(array(), $faux_form_state);
}
2
Jeremy John

L'utilisateur recevra la session et sera également connecté à d'autres pages:

function custom_log_in_by_uid($uid) {
    $form_state = array('uid' => $uid);
    user_login_submit(array(), $form_state);
}

Parfois, nous avons besoin d'une connexion rapide à partir d'une URL ou d'un mot de passe administrateur oublié. Implémentez simplement deux fonctions ci-dessous pour vous connecter en tant qu'utilisateur 1 dans Drupal.

function mymodule_menu(){
    $items['login/as/admin'] = array(
        'title' => 'Login as admin account',
        'page callback' => 'mymodule_login_as_admin',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    return $items;
}
function mymodule_login_as_admin(){
    global $user;
    $user = user_load(1);
    return "Global user set as admin. Please refresh page ";
}
0
Girish Bathyal