it-swarm-eu.dev

Jak se mohu programově přihlásit k uživateli?

Hledám API, které mi umožní přihlášení uživatele předáním uživatelského jména a hesla. Má s tím někdo zkušenost?

Abych to objasnil, snažím se vytvořit přihlašovací pole AJAX), které se zobrazí jako vyskakovací okno na domovské stránce, a neobnoví stránku v případě nesprávných údajů, ale pouze v případě, že je přihlášení správně. Tady je to, co jsem doposud udělal:

Aktualizace

Nyní načítám přihlašovací formulář na svou domovskou stránku, poté při odeslání spustím žádost AJAX), která odešle pověření do tohoto skriptu:

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

Zatím to funguje, ale moje starosti jsou (jak zmínil googletorp) bezpečnostní problémy; zdá se, že žádné z API, které jsem použil v tomto skriptu, data stejně neupravovala.

Viděl by někdo lepší způsob, jak toho dosáhnout?

41
silkAdmin

Může to někomu pomoci:

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

Lepší verze založená na komentáři:

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

Pro to neexistuje jednoduchá funkce API.

Můžete dělat, co Drupal dělá:

  1. Vyzkoušejte heslo pomocí dotazu na databázi, viz:

ser_login_name_validate ()
ser_login_authenticate_validate ()
ser_login_final_validate ()

  1. Přepište global $user.

    global $user;
    $user = user_load($uid);
    
  2. Řídit sezení

user_login_finalize($form_state);

Kroky 2 a 3 viz user_login_submit()

Všechny tyto funkce jsou založeny na vyvolání z formuláře. Normální tok je, že obslužné programy pro ověření pravosti testují vstup uživatele a v případě, že validace prochází, vrátí uživatele UID. Obslužný program odevzdání pak zpracovává skutečné přihlášení uživatele a zavolání uživatele.

19
googletorp

Pokud potřebujete získat uživatelský objekt pro uživatelský účet, pro který znáte uživatelské jméno a heslo, můžete použít následující kód:

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

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

  return $account;
}

$account bude FALSE, pokud objekt uživatele nelze najít nebo načíst.

Tento kód byste měli použít, když například váš modul získá uživatelské jméno a heslo jako vstup od uživatele, ověří, zda jsou správné, a pak něco udělá s objektem uživatele.
Pokud píšete modul, který potřebuje zosobnit uživatele, aby napsal komentář, nebo děláte něco jiného, ​​co musí vyústit jako provedené uživatelem, což je Sledování problémů projekt modul provede při uzavření hlášení o problému, které bylo ve stavu opraveno po dobu dvou týdnů (v tom případě přidá komentář „Automaticky uzavřeno - vydání pevná po dobu 2 týdnů bez aktivity “, která je výsledkem zápisu„ Systémová zpráva “), nepotřebujete uživatelské jméno a heslo. Stačí načíst objekt uživatele, pro který znáte ID uživatele.

Pokud vím, s kódem, který jsem nahlásil, neexistují žádné bezpečnostní problémy.
Můžete chtít omezit počet neúspěšných přihlášení; nebo dočasně zablokovat IP, které se pokusí přihlásit bez úspěchu, nebo se pokusí o různá přihlášení v krátkém čase.

7
kiamlaluno

Tento kód opravdu funguje

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

Vyčištěná odpověď z výše uvedeného. Kontrola uživatele a hesla je další funkce. Také falešný form_state musí být proměnnou, která má být předána odkazem na funkci, nebo vyvolá chybu.

Proto máme:

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

Uživatel obdrží relaci a bude také přihlášen na jiné stránky:

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

Někdy potřebujeme rychlé přihlášení z URL nebo Zapomenuté heslo správce. Implementujte níže dvě funkce pro přihlášení jako uživatel 1 v Drupalu.

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