it-swarm-id.com

Masuk pengguna tanpa mendapatkan kata sandi dari mereka

Persyaratan saya adalah sesuatu seperti login oleh Facebook, jadi pengguna tidak memberikan kata sandi tetapi akan login. Saya ingin membuat pengguna masuk dari dalam kode ekstensi dengan mengetahui user id and/or username but not password.

Bagaimana aku melakukan itu? Saya juga mencoba untuk mendapatkan kata sandi terenkripsi pengguna dari database dan memasukkan nama pengguna dan kata sandi itu dalam metode login () dan kemudian ada yang tidak beres, mendapatkan username and password mismatch error, Meskipun masuk!

Saya juga menemukan beberapa kode dari googling -

JPluginHelper::importPlugin('user');
$options = array();
$options['action'] = 'core.login.site';
$response->username = "user_name_here";
$result = $app->triggerEvent('onUserLogin', array((array)$response, $options));

Tampaknya bekerja, tapi saya tidak tahu apakah ada kemungkinan ini menjadi salah nanti ketika melakukan ini dalam versi 2.5 dan 3.0.

6
dev-m

Sejauh yang saya ketahui, tidak ada bagian dari ini yang sudah usang, jadi kode ini harus terus berfungsi dengan benar dalam pemasangan 2.5 dan 3.0. Bahkan jika sesuatu menjadi usang, Anda harus dapat menjalankan ini setidaknya melalui versi 4.0.

Yang sedang berkata, tidak satu pun dari potongan-potongan ini cenderung dihapus. Anda mengimpor plugin pengguna dan kemudian memicu acara onUserLogin. Ini adalah metode standar untuk memicu plugin, jadi harus konsisten untuk sementara waktu.

Satu-satunya bagian yang perlu diingat adalah bahwa Anda merusak keamanan yang mengharuskan pengguna untuk login dengan kata sandi mereka. Pastikan bahwa bagian yang Anda gunakan untuk mengganti itu juga aman.


Perbarui per komentar

Panggilan triggerEvent dijalankan melalui berbagai plugin pengguna (ditemukan di plugins/user/ dan memanggil metode onUserLogin jika ada. Fungsi kuncinya adalah yang ada di plugin joomla. Saya menyalin seluruh fungsi di bawah ini:

public function onUserLogin($user, $options = array())
{
    $instance = $this->_getUser($user, $options);

    // If _getUser returned an error, then pass it back.
    if ($instance instanceof Exception)
    {
        return false;
    }

    // If the user is blocked, redirect with an error
    if ($instance->get('block') == 1)
    {
        $this->app->enqueueMessage(JText::_('JERROR_NOLOGIN_BLOCKED'), 'warning');

        return false;
    }

    // Authorise the user based on the group information
    if (!isset($options['group']))
    {
        $options['group'] = 'USERS';
    }

    // Check the user can login.
    $result = $instance->authorise($options['action']);

    if (!$result)
    {
        $this->app->enqueueMessage(JText::_('JERROR_LOGIN_DENIED'), 'warning');

        return false;
    }

    // Mark the user as logged in
    $instance->set('guest', 0);

    // Register the needed session variables
    $session = JFactory::getSession();
    $session->set('user', $instance);

    // Check to see the the session already exists.
    $this->app->checkSession();

    // Update the user related fields for the Joomla sessions table.
    $query = $this->db->getQuery(true)
        ->update($this->db->quoteName('#__session'))
        ->set($this->db->quoteName('guest') . ' = ' . $this->db->quote($instance->guest))
        ->set($this->db->quoteName('username') . ' = ' . $this->db->quote($instance->username))
        ->set($this->db->quoteName('userid') . ' = ' . (int) $instance->id)
        ->where($this->db->quoteName('session_id') . ' = ' . $this->db->quote($session->getId()));
    $this->db->setQuery($query)->execute();

    // Hit the user last visit field
    $instance->setLastVisit();

    return true;
}

Plugin ini sama sekali tidak memeriksa kata sandi (yang dilakukan oleh plugin otentikasi). Jadi ini sebagian besar hanya memeriksa bahwa pengguna tidak diblokir dan dapat masuk sebelum mengatur data pengguna ke dalam sesi.

Penyimpanan sesi itu adalah kunci untuk menampilkan pengguna sebagai login. Tentu saja Anda bisa menggunakan kode ini secara langsung, tetapi sebenarnya akan jauh lebih rumit daripada hanya membiarkan plugin ini melakukan pekerjaan memeriksa apakah pengguna tidak diblokir, menyimpan informasi mereka di sesi, dan menandai waktu kunjungan terakhir.

4
David Fritsch

Jika Anda mengubah ini, itu akan berhasil:

 JPluginHelper :: importPlugin ('user'); 
 $ Options = array (); 
 $ Options ['action'] = 'core.login.site'; 
 $ response = array (); // Tambahkan baris ini 
 $ Response ['language'] = ""; // Tambahkan baris ini 
 $ Response ['username'] = "user_name_here"; // Ubah baris ini 
 $ Result = $ app-> triggerEvent ('onUserLogin', array ((array) $ response, $ options)); 
0
Alireza Balvardi