Bagaimana cara saya login secara pengguna?

41

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 me-refresh halaman jika salah kredensial, tetapi hanya jika masuk benar. Jadi, inilah yang telah saya lakukan sejauh ini:

Memperbarui

Saya sekarang memuat formulir login di beranda saya, kemudian saat 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 (seperti yang disebutkan oleh googletorp) masalah keamanan; tampaknya tidak ada API yang saya gunakan dalam skrip ini yang membersihkan data.

Adakah yang melihat cara yang lebih baik untuk melakukannya?

sutra sutera
sumber
Untuk alasan apa Anda perlu masuk pengguna dari kode menggunakan nama pengguna, dan kata sandi?
kiamlaluno
@ kiamlaluno Karena saya perlu menggunakan Ajax pada formulir login. Dalam pertanyaan saya sebelumnya: drupal.stackexchange.com/questions/5780/… drupal.stackexchange.com/questions/5781/... Saya tidak bisa menyelesaikan salah satu dari dua masalah ini jadi saya mencari permintaan ajax khusus.
silkAdmin

Jawaban:

33

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;
    }
}
pengguna1750
sumber
3
user_authenticate sudah mengembalikan $ uid jadi tidak perlu memuat objek pengguna;)
FLY
7
Blok kode kedua tidak akan berfungsi; Argumen ke-2 user_login_submit disahkan oleh ref; melewatinya output dari array () akan gagal.
Shawn Conn
Bagaimana jawaban ini digunakan untuk login otomatis seorang pengguna setelah mereka dibuat menggunakan formulir pendaftaran? Saya ingin melakukan itu, tetapi kata sandi adalah hash ketika disediakan melalui objek akun sebagai parameter dalam hook_user_inserttetapi fungsi di atas dalam jawaban ingin kata sandi sebagai teks biasa asli. Saya kira saya harus mencoba hook_form_altersebagai gantinya ...
therobyouknow
Untuk orang yang mencari login otomatis langsung setelah pengguna baru telah dibuat (misalnya melalui formulir pendaftaran pendaftaran pengguna misalnya 'pengguna / daftar'), lihat solusi ini: drupal.stackexchange.com/a/254905/1082
therobyouknow
19

Tidak ada fungsi API sederhana untuk itu.

Anda dapat melakukan apa yang Drupal lakukan:

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

user_login_name_validate ()
user_login_authenticate_validate ()
user_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 uid pengguna jika validasi berlalu. Pengirim menyerahkan kemudian menangani login pengguna yang sebenarnya dan menelepon pengait pengguna.

googletorp
sumber
terima kasih googletorp, saya akan mencobanya, meskipun ini biarkan saya bertanya-tanya tentang bagaimana fungsi ini bekerja bersama .. Bagaimana orang tahu bahwa saya telah memohon preseden?
silkAdmin
oh dan jika saya tidak memiliki variabel From_state yang tersedia tetapi hanya nama pengguna dan kata sandi, dapatkah saya membangunnya kembali seperti: $form_state['value']['name'] = $_POST['name']dan seterusnya ..
silkAdmin
@silk Anda harus selalu menggunakan FAPI Drupal yang memberi Anda $form_statevariabel. Ada banyak pemeriksaan keamanan yang bagus bahwa Anda akan kehilangan dan mungkin membuka situs Anda untuk serangan. Ketika datang ke login pengguna, Anda tidak ingin kehilangan keamanan itu.
googletorp
Silakan periksa pertanyaan saya yang diperbarui, saya benar-benar ingin tahu apakah input saya dibersihkan .. Terima kasih
silkAdmin
Maaf sepertinya hasil edit tidak berfungsi pertama kali, sekarang ini diperbarui.
silkAdmin
7

Jika Anda perlu mendapatkan objek pengguna untuk akun pengguna yang Anda ketahui nama pengguna dan kata sandinya, 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;
}

$accountakan terjadi FALSEjika 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 dilakukan modul pelacakan masalah Proyek saat menutup laporan masalah yang telah ada di status tetap selama dua minggu (dalam hal itu, ia menambahkan komentar "Secara otomatis ditutup - masalah diperbaiki selama 2 minggu tanpa aktivitas" yang hasilnya ditulis oleh pengguna "Pesan Sistem"), 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 hasil, atau mencoba login yang berbeda dalam waktu singkat.

kiamlaluno
sumber
terima kasih kiamlaluno, ini semacam apa yang saya lakukan, tetapi saya sekarang mengkhawatirkan masalah keamanan, silakan periksa pertanyaan saya yang diperbarui
silkAdmin
3

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();
vacho
sumber
Itu tidak memanggil hook_user_login, lihat fungsi user_login_finalize ().
skorzh
2

Dibersihkan jawaban dari atas. Memeriksa pengguna dan kata sandi adalah fitur tambahan. Selain itu, form_state palsu harus berupa variabel yang harus dilewatkan dengan merujuk ke fungsi atau ada 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);
}
Jeremy John
sumber
0

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);
}
Віктор Плясун
sumber
0

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 ";
}
Girish Bathyal
sumber