it-swarm-id.com

Bagaimana cara saya login secara pengguna?

Saya mencari API yang memungkinkan saya masuk ke pengguna dengan memberikan nama pengguna dan kata sandi. Adakah yang punya pengalaman dengan ini?

Untuk memperjelas, saya mencoba membuat kotak masuk AJAX yang muncul sebagai sembulan di beranda, dan jangan menyegarkan laman jika salah kredensial, tetapi hanya jika masuk adalah benar. Jadi inilah yang telah saya lakukan sejauh ini:

Memperbarui

Saya sekarang memuat formulir login di beranda saya, kemudian pada pengiriman saya meluncurkan permintaan AJAX yang mengirimkan kredensial ke skrip ini:

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

Sejauh ini berhasil, tetapi kekhawatiran saya adalah (sebagaimana disebutkan oleh googletorp) masalah keamanan; tampaknya tidak ada API yang saya gunakan dalam skrip ini yang membersihkan data dengan cara apa pun.

Adakah yang melihat cara yang lebih baik untuk melakukannya?

41
silkAdmin

Ini mungkin membantu seseorang:

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

Versi yang lebih baik berdasarkan komentar:

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

Tidak ada fungsi API sederhana untuk itu.

Anda dapat melakukan apa yang Drupal tidak:

  1. Uji kata sandi dengan menanyakan basis data, lihat:

ser_login_name_validate ()
ser_login_authenticate_validate ()
ser_login_final_validate ()

  1. Timpa global $user.

    global $user;
    $user = user_load($uid);
    
  2. Menangani sesi

user_login_finalize($form_state);

Untuk langkah dua dan 3 lihat user_login_submit()

Semua fungsi ini didasarkan pada dipanggil dari formulir. Aliran normal adalah bahwa penangan yang valid menguji input pengguna dan mengembalikan cairan pengguna jika validasi berlalu. Pengirim yang menyerahkan kemudian menangani login pengguna yang sebenarnya dan menelepon pengait pengguna.

19
googletorp

Jika Anda perlu mendapatkan objek pengguna untuk akun pengguna yang Anda ketahui nama pengguna dan kata sandi, maka Anda dapat menggunakan kode berikut:

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

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

  return $account;
}

$account akan menjadi FALSE jika objek pengguna tidak dapat ditemukan atau dimuat.

Anda harus menggunakan kode ini ketika, misalnya, modul Anda mendapatkan nama pengguna dan kata sandi sebagai input dari pengguna, memverifikasi apakah mereka benar, dan kemudian melakukan sesuatu dengan objek pengguna.
Jika Anda menulis modul yang perlu menyamar sebagai pengguna untuk menulis komentar, atau melakukan hal lain yang perlu dihasilkan seperti yang dilakukan oleh pengguna, itulah yang (Pelacakan masalah proyek modul tidak ketika menutup laporan masalah yang telah dalam status tetap selama dua minggu (dalam kasus itu, ia menambahkan komentar "Secara otomatis ditutup - masalah diperbaiki selama 2 minggu tanpa aktivitas "yang hasilnya ditulis oleh pengguna" System Message "), maka Anda tidak memerlukan nama pengguna dan kata sandi. Anda hanya memuat objek pengguna yang Anda tahu ID pengguna.

Sejauh yang saya tahu, tidak ada masalah keamanan dengan kode yang saya laporkan.
Anda dapat membatasi jumlah login yang gagal; atau untuk sementara memblokir IP yang mencoba masuk tanpa keberhasilan, atau mencoba login yang berbeda dalam waktu singkat.

7
kiamlaluno

Kode ini benar-benar berfungsi

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

Bersihkan jawaban dari atas. Memeriksa pengguna dan kata sandi adalah fitur tambahan. Juga, form_state palsu harus berupa variabel yang harus dilewatkan dengan merujuk ke fungsi atau ia melempar kesalahan.

Karena itu kami memiliki:

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

Pengguna akan menerima sesi dan juga akan masuk ke halaman lain:

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

Terkadang kita memerlukan login cepat dari URL atau Lupa kata sandi admin. Cukup terapkan di bawah ini dua fungsi untuk login sebagai pengguna 1 di 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