it-swarm.dev

Iniciar sesión de usuario sin obtener contraseña de ellos

Mi requisito es algo así como iniciar sesión en Facebook, por lo que el usuario no proporciona contraseña pero inicia sesión. Quiero que un usuario inicie sesión desde dentro del código de extensión conociendo su user id and/or username but not password.

¿Cómo puedo hacer eso? También intenté obtener la contraseña cifrada del usuario de la base de datos y poner el nombre de usuario y esa contraseña en el método login () y luego algo salió mal, obteniendo username and password mismatch error, ¡aunque haya iniciado sesión!

También encontré algunos códigos de googlear:

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

Parece funcionar, pero no sé si hay alguna posibilidad de que esto ocurra más tarde al hacer esto en las versiones 2.5 y 3.0.

6
dev-m

Hasta donde yo sé, ninguna parte de esto está en desuso, por lo que este código definitivamente debería continuar funcionando correctamente en las instalaciones 2.5 y 3.0. Incluso si algo queda obsoleto, debería poder ejecutar esto al menos a través de la versión 4.0.

Dicho esto, es probable que ninguna de estas piezas se elimine. Está importando los complementos de usuario y luego activa el evento onUserLogin. Este es el método estándar para activar complementos, por lo que debe ser coherente durante un tiempo.

La única otra pieza para recordar es que está minando la seguridad de requerir que un usuario inicie sesión con su contraseña. Asegúrese de que la pieza que está utilizando para reemplazar también sea segura.


Actualización por comentario

La llamada triggerEvent se ejecuta a través de los diferentes complementos de usuario (que se encuentran en plugins/user/ y llama al método onUserLogin si existe. La función clave es la del complemento joomla. Estoy copiando toda la función a continuación:

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

Este complemento no verifica la contraseña (lo hacen los complementos de autenticación). Por lo tanto, esto solo comprueba que el usuario no esté bloqueado y puede iniciar sesión antes de configurar los datos del usuario en la sesión.

El almacenamiento de la sesión es la clave para mostrar al usuario como conectado. Naturalmente, podría usar este código directamente, pero en realidad sería mucho más complicado que simplemente dejar que este complemento haga el trabajo de verificar que el usuario no esté bloqueado, almacenando su información en la sesión, y marcando el tiempo de la última visita.

4
David Fritsch

Si cambia esto, funcionará:

 JPluginHelper :: importPlugin ('usuario'); 
 $ Opciones = matriz (); 
 $ Opciones ['acción'] = 'core.login.site'; 
 $ respuesta = array (); // Agregue esta línea 
 $ Response ['language'] = ""; // Agregue esta línea 
 $ Response ['username'] = "user_name_here"; // Cambia esta línea 
 $ Result = $ app-> triggerEvent ('onUserLogin', array ((array) $ response, $ options)); 
0
Alireza Balvardi