it-swarm-vi.com

Đăng nhập người dùng mà không nhận được mật khẩu từ họ

Yêu cầu của tôi là một cái gì đó giống như đăng nhập bởi Facebook, vì vậy người dùng không cung cấp mật khẩu nhưng được đăng nhập. Tôi muốn làm cho người dùng đăng nhập từ bên trong mã tiện ích mở rộng bằng cách biết user id and/or username but not password.

Làm thế nào để làm điều đó? Tôi cũng đã cố gắng lấy mật khẩu được mã hóa của người dùng từ cơ sở dữ liệu và đặt tên người dùng và mật khẩu đó vào phương thức login () và sau đó đã xảy ra lỗi, nhận username and password mismatch error, Mặc dù đã đăng nhập!

Tôi cũng tìm thấy một số mã từ googling -

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

Nó dường như hoạt động, nhưng tôi không biết liệu có bất kỳ cơ hội nào điều này trở thành sai sau này khi thực hiện điều này trong cả hai phiên bản 2.5 và 3.0 hay không.

6
dev-m

Theo như tôi biết, không có phần nào trong số này bị phản đối, vì vậy mã này chắc chắn sẽ tiếp tục hoạt động chính xác trong các bản cài đặt 2.5 và 3.0. Ngay cả khi một cái gì đó bị phản đối, bạn sẽ có thể chạy nó ít nhất thông qua phiên bản 4.0.

Điều đó đang được nói, không có phần nào trong số này có khả năng bị loại bỏ. Bạn đang nhập các plugin người dùng và sau đó kích hoạt sự kiện onUserLogin. Đây là phương pháp tiêu chuẩn để kích hoạt các plugin, vì vậy nó phải nhất quán trong một thời gian.

Điều duy nhất khác cần nhớ là bạn đang làm suy yếu tính bảo mật của việc yêu cầu người dùng đăng nhập bằng mật khẩu của họ. Hãy chắc chắn rằng phần mà bạn đang sử dụng để thay thế cũng an toàn.


Cập nhật mỗi bình luận

Cuộc gọi triggerEvent chạy qua các plugin người dùng khác nhau (được tìm thấy tại plugins/user/ và gọi phương thức onUserLogin nếu nó tồn tại. Chức năng chính là một trong plugin joomla. Tôi đang sao chép toàn bộ chức năng dưới đây:

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 này hoàn toàn không kiểm tra mật khẩu (được thực hiện bởi các plugin xác thực). Vì vậy, điều này chủ yếu chỉ kiểm tra rằng người dùng không bị chặn và có thể đăng nhập trước khi đặt dữ liệu của người dùng vào phiên.

Lưu trữ phiên đó là chìa khóa để hiển thị người dùng khi đăng nhập. Đương nhiên, bạn chỉ có thể sử dụng mã này trực tiếp, nhưng thực tế sẽ phức tạp hơn nhiều so với việc để plugin này thực hiện công việc kiểm tra rằng người dùng không bị chặn, lưu trữ thông tin của họ trong phiên, và đánh dấu thời gian truy cập cuối cùng.

4
David Fritsch

Nếu bạn thay đổi điều này, nó sẽ hoạt động:

[.__.] JPluginHelper :: importPlugin ('user'); 
 $ reply = mảng (); // Thêm dòng này [.__.] $ Phản hồi ['ngôn ngữ'] = ""; // Thêm dòng này [.__.] $ Phản hồi ['username'] = "user_name_here"; // Thay đổi dòng này [.___
0
Alireza Balvardi