it-swarm.it

Come posso accedere a livello di codice a un utente?

Sto cercando l'API che mi permetterà di accedere a un utente passandogli nome utente e password. Qualcuno ha esperienza con questo?

Per chiarire, sto cercando di creare una AJAX che appare come popup nella home page e non aggiorna la pagina in caso di credenziali errate, ma solo se il login è corretto. Quindi ecco cosa ho fatto finora:

Aggiornare

Ora carico il modulo di accesso sulla mia homepage, quindi alla presentazione lancio una AJAX richiesta che invia le credenziali a questo 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;
}; 

Finora funziona, ma le mie preoccupazioni sono (come menzionato da googletorp) problemi di sicurezza; sembra che nessuna delle API che ho usato in questo script abbia disinfettato i dati in ogni caso.

Qualcuno vedrebbe un modo migliore per farlo?

41
silkAdmin

Questo potrebbe aiutare qualcuno:

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;
    }
}

Una versione migliore basata sul commento:

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

Non esiste una semplice funzione API per questo.

Puoi fare cosa Drupal fa:

  1. Testare la password eseguendo una query sul database, consultare:

ser_login_name_validate ()
ser_login_authenticate_validate ()
ser_login_final_validate ()

  1. Sovrascrivi il global $user.

    global $user;
    $user = user_load($uid);
    
  2. Gestire le sessioni

user_login_finalize($form_state);

Per i passaggi 2 e 3, vedere user_login_submit()

Tutte queste funzioni si basano sul richiamo da un modulo. Il flusso normale è che i gestori di validazione testano l'input dell'utente e restituiscono l'UID dell'utente se la validazione passa. Il gestore di invio gestisce quindi l'effettivo accesso dell'utente e il hook utente chiamante.

19
googletorp

Se è necessario ottenere l'oggetto utente per l'account utente per il quale si conoscono nome utente e password, è possibile utilizzare il seguente codice:

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

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

  return $account;
}

$account sarà FALSE se l'oggetto utente non può essere trovato o caricato.

Dovresti usare questo codice quando, ad esempio, il tuo modulo ottiene il nome utente e la password come input da un utente, verifica se sono corretti e quindi fa qualcosa con l'oggetto utente.
Se stai scrivendo un modulo che deve impersonare un utente per scrivere un commento o stai facendo qualcos'altro che deve risultare come fatto da un utente, che è ciò che Tracking del problema del progetto il modulo esegue la chiusura di un rapporto sui problemi che è stato nello stato fisso per due settimane (in tal caso, aggiunge il commento "Chiuso automaticamente - problema risolto per 2 settimane senza attività "che risulta scritto dall'utente" Messaggio di sistema "), quindi non sono necessari nome utente e password. Devi solo caricare l'oggetto utente per il quale conosci l'ID utente.

Per quanto ne so, non ci sono problemi di sicurezza con il codice che ho segnalato.
Potresti voler limitare il numero di accessi falliti; o per bloccare temporaneamente l'IP che tenta di accedere senza successo o tenta diversi accessi in breve tempo.

7
kiamlaluno

Questo codice funziona davvero

//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

Risposta pulita da quanto sopra. Il controllo di utente e password è una funzione aggiuntiva. Inoltre, il form_state falso deve essere una variabile da passare in riferimento alla funzione o genera un errore.

Quindi abbiamo:

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

L'utente riceverà la sessione e accederà anche ad altre pagine:

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

A volte abbiamo bisogno di un accesso rapido dall'URL o dalla password dell'amministratore dimenticata. Basta implementare di seguito due funzioni per accedere come utente 1 in 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