Bir kullanıcıyı programlı olarak nasıl giriş yapabilirim?


41

Kullanıcı adı ve şifresini ileterek giriş yapmama izin verecek API'yi arıyorum. Bununla ilgili tecrübesi olan var mı?

Açıklığa kavuşturmak için, ana sayfada açılır bir pencere olarak görünen bir AJAX giriş kutusu oluşturmaya çalışıyorum ve yanlış kimlik bilgileri olması durumunda sayfayı yenilemiyorum, ancak yalnızca giriş doğruysa. İşte şimdiye dek yaptıklarım:

Güncelleme

Şimdi giriş formunu ana sayfama yüklüyorum, sonra gönderim sırasında bu betiğe kimlik bilgileri gönderen bir AJAX isteği başlatıyorum:

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

Şimdiye kadar işe yarıyor ama endişelerim (googletorp tarafından belirtildiği gibi) güvenlik sorunları; Görünüşe göre bu komut dosyasında kullandığım hiçbir API, verileri zaten temizlememiş.

Bunu yapmanın daha iyi bir yolunu gören var mı?


Hangi nedenle, kullanıcı adı ve şifreyi kullanarak bir kullanıcı kodundan giriş yapmanız gerekir.
kiamlaluno

@ kiamlaluno Çünkü giriş formunda Ajax kullanmam gerekiyor. Daha önceki sorularımda: drupal.stackexchange.com/questions/5780/… drupal.stackexchange.com/questions/5781/… Bu iki sorunun hiçbirini çözemedim, bu yüzden özel bir ajax isteğinde bulundum .
silkAdmin

Yanıtlar:


33

Bu birine yardımcı olabilir:

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

Yorumu temel alan daha iyi bir sürüm:

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

3
user_authenticate zaten $ uid değerini döndürür, bu nedenle kullanıcı nesnesini yüklemeye gerek kalmaz;)
FLY

7
İkinci kod bloğu çalışmayacak; user_login_submit'ın 2. argümanı ref; array () 'in çıktısını almak başarısız olur.
Shawn Conn

Bu cevap, bir kullanıcı bir kayıt formu kullanılarak oluşturulduktan sonra otomatik olarak oturum açmak için nasıl kullanılır? Bunu yapmak istiyorum, ancak parola parametre olarak hesap nesnesi üzerinden sağlandığında bir karmaşaydı hook_user_insertancak cevaptaki yukarıdaki işlevler parolayı orijinal düz metin olarak istiyor. Sanırım hook_form_alteronun yerine denemem gerekecek ...
therobyouknow

Yeni kullanıcı oluşturulduktan hemen sonra otomatik olarak oturum açmayı arayan kişiler için (örn. 'Kullanıcı / kayıt' gibi bir kullanıcı kayıt formu aracılığıyla), şu çözüme bakın: drupal.stackexchange.com/a/254905/1082
therobyouknow

19

Bunun için basit bir API işlevi yoktur.

Drupal'ın yaptığını yapabilirsiniz:

  1. Veritabanını sorgulayarak şifreyi test edin:

user_login_name_validate ()
user_login_authenticate_validate ()
user_login_final_validate ()

  1. Üzerine yaz global $user.

    global $user;
    $user = user_load($uid);
  2. Oturumları yönet

user_login_finalize($form_state);

İkinci ve üçüncü adımlar için bkz. user_login_submit()

Tüm bu işlevler bir formdan çağrılmaya dayanır. Normal akış, doğrulama işleyicilerinin kullanıcıların girişini test etmesi ve doğrulama geçerse kullanıcının kullanıcı kimliğini döndürmesidir. Gönderme işleyicisi daha sonra kullanıcının gerçek girişini ve arama kancasını kullanır.


teşekkürler googletorp, bunu deneyeceğim, bu fonksiyonların birlikte nasıl çalıştığını merak etmeme rağmen… Biri emsali çağırdığımı nasıl bilebilir?
silkAdmin

oh ve eğer From_state değişkenini kullanamıyorsam, sadece kullanıcı adı ve şifrem varsa, onu şöyle yapabilirim: $form_state['value']['name'] = $_POST['name']ve benzerleri ..
silkAdmin

@silk Her zaman size $form_statedeğişkeni veren Drupal FAPI'yi kullanmalısınız . Saldırılar için sitenizi başka türlü gevşek ve olası bir şekilde açacağınız çok sayıda güvenlik kontrolü vardır. Bir kullanıcının oturum açması söz konusu olduğunda, bu güvenliği kaybetmek istemezsiniz.
googletorp

Lütfen güncellenmiş sorumu kontrol edin, girdilerimin temizlenip temizlenmediğini gerçekten bilmek istiyorum .. Teşekkürler
silkAdmin

Maalesef, düzenleme ilk defa işe yaramadı, şimdi güncellendi.
silkAdmin

7

Kullanıcı adını ve şifresini tanıdığınız kullanıcı hesabı için kullanıcı nesnesini almanız gerekirse, aşağıdaki kodu kullanabilirsiniz:

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

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

  return $account;
}

$accountolacak FALSEkullanıcı nesnesi bulunamadı veya yüklenemez eğer.

Örneğin, modülünüz bir kullanıcıdan girdi olarak kullanıcı adı ve şifreyi aldığında, doğru olup olmadıklarını doğruladığında ve sonra kullanıcı nesnesiyle bir şeyler yaptığında bu kodu kullanmalısınız.
Yorum yazması için bir kullanıcıyı taklit etmesi gereken bir modül yazıyorsanız veya bir kullanıcı tarafından sonuçlandırılması gereken başka bir şey yapıyorsanız, Proje konusu izleme modülünün içinde yer alan bir sorun raporunu kapatırken yaptığı şeydir. iki hafta boyunca sabit durum (bu durumda, "Sistem Mesajı" kullanıcısı tarafından yazılan sonuçların "Sistem mesajı" kullanıcısı tarafından yazılan "Otomatik olarak kapandı - sorun 2 hafta süreyle düzeltildi") yorumunu ekler, sonra kullanıcı adı ve parola gerekmez. Sadece kullanıcı kimliğini bildiğiniz kullanıcı nesnesini yüklersiniz.

Bildiğim kadarıyla, bildirdiğim kodla ilgili herhangi bir güvenlik sorunu yok.
Başarısız olan giriş sayısını sınırlamak isteyebilirsiniz; veya başarıyla giriş yapmayı deneyen veya kısa sürede farklı girişler yapan IP’yi geçici olarak engellemek.


teşekkür ederim kiamlaluno, yaptığım işte bu, ama şimdi güvenlik sorunları hakkında
endişeliyim

3

Bu kod gerçekten işe yarıyor

//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();

Hook_user_login'i çağırmaz, bkz. User_login_finalize () işlevi.
skorzh

2

Yukarıdaki cevap temizlendi. Kullanıcı ve şifreyi kontrol etmek ek bir özelliktir. Ayrıca, sahte form_state, işleve referansla iletilecek bir değişken olmalıdır veya bir hata atar.

Dolayısıyla biz var:

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

0

Kullanıcı oturumu alacak ve diğer sayfalara da giriş yapacaktır:

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

0

Bazen URL’den veya yönetici şifremi unuttum’dan hızlı giriş yapmamız gerekir. Sadece Drupal'da kullanıcı 1 olarak giriş yapmak için iki işlevi uygulayın.

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 ";
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.