web-gelistirme-sc.com

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

Ben kullanıcı adı ve şifre geçirerek bir kullanıcı giriş sağlayacak API arıyorum. Herkes bu konuda deneyim var mı?

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

Güncelleme

Şimdi giriş sayfamı ana sayfama yüklüyorum, daha sonra bu komut dosyasına kimlik bilgisi gönderen bir AJAX istek başlattım:

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 çalışıyor, ancak endişelerim (googletorp tarafından belirtildiği gibi) güvenlik sorunları; Bu komut dosyasında kullandığım API'lerin hiçbirinin zaten verileri temizlemediği anlaşılıyor.

Bunu yapmanın daha iyi bir yolu var mı?

41
silkAdmin

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

Yoruma dayalı 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;
    }
}
33
user1750

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

Drupal ne yapar:

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

ser_login_name_validate ()
ser_login_authenticate_validate ()
ser_login_final_validate ()

  1. global $user Üzerine yaz.

    global $user;
    $user = user_load($uid);
    
  2. İşlem oturumları

user_login_finalize($form_state);

İkinci ve üçüncü adım için user_login_submit()

Tüm bu işlevler bir formdan çağrılmaya dayanır. Normal akış, doğrulama işleyicilerinin kullanıcı girişini sınaması ve doğrulama başarılı olursa kullanıcının kullanıcı kimliğini döndürmesidir. Gönderme işleyicisi daha sonra kullanıcının gerçek oturum açma ve çağıran kullanıcı kancasını işler.

19
googletorp

Kullanıcı adını ve şifresini bildiğiniz kullanıcı hesabı için kullanıcı nesnesini almanız gerekiyorsa, 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;
}

Kullanıcı nesnesi bulunamaz veya yüklenemezse $accountFALSE olur.

Örneğin, modülünüz kullanıcı adını ve şifreyi bir kullanıcıdan girdi olarak aldığında, doğru olup olmadığını doğruladığında ve kullanıcı nesnesiyle ilgili bir şey yaptığında bu kodu kullanmalısınız.
Yorum yazmak için bir kullanıcının kimliğine bürünmesi gereken bir modül yazıyorsanız veya bir kullanıcı tarafından yapıldığı gibi sonuçlanması gereken başka bir şey yapıyorsanız, Proje sorun izleme modülü iki hafta boyunca sabit durumundaki bir sorun raporunu kapatırken yapar (bu durumda, "Otomatik olarak kapatıldı - sorun" "Sistem Mesajı" kullanıcısı tarafından yazılan hiçbir etkinlik olmadan "2 hafta boyunca düzeltildi), kullanıcı adı ve parolaya ihtiyacınız yoktur. 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 oturum açma sayısını sınırlamak isteyebilirsiniz; veya başarılı bir şekilde oturum açmaya çalışan veya kısa sürede farklı girişleri deneyen IP'yi geçici olarak engellemek için.

7
kiamlaluno

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();
3
vacho

Yukarıdaki cevap temizlendi. Kullanıcı ve parolanın kontrol edilmesi ek bir özelliktir. Ayrıca, sahte form_state işlevine başvurularak iletilecek bir değişken olmalıdır veya bir hata atar.

Bu nedenle:

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

Kullanıcı oturumu alır ve diğer sayfalarda da oturum açar:

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

Bazen URL'den hızlı oturum açmamız veya Yönetici şifresini unuttuk. Drupal'da kullanıcı 1 olarak oturum açmak için aşağıdaki iki işlevi uygulamanız yeterlidir.

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