desenv-web-rp.com

Efetuando login do usuário sem obter a senha deles

Meu requisito é algo como o login pelo Facebook, para que o usuário não forneça a senha, mas faça o login. Quero fazer com que o usuário faça login no código de extensão conhecendo sua user id and/or username but not password.

Como faço isso? Também tentei obter a senha criptografada do usuário no banco de dados e colocar o nome de usuário e essa senha no método login () e, em seguida, algo deu errado, ficando username and password mismatch error, apesar de estar logado!

Também encontrei alguns códigos no Google -

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, mas não sei se há alguma chance disso se tornar errado mais tarde, ao fazer isso nas versões 2.5 e 3.0.

6
dev-m

Pelo que sei, nenhuma parte disso foi preterida, portanto esse código definitivamente deve continuar funcionando corretamente nas instalações 2.5 e 3.0. Mesmo se algo for descontinuado, você poderá executá-lo pelo menos na versão 4.0.

Dito isto, é provável que nenhuma dessas peças seja removida. Você está importando os plugins de usuário e, em seguida, acionando o evento onUserLogin. Este é o método padrão para acionar plugins, portanto deve ser consistente por um tempo.

A única outra coisa a lembrar é que você está comprometendo a segurança de exigir que um usuário faça login com sua senha. Certifique-se de que a peça que você está usando para substituir também esteja segura.


Atualizar por comentário

A chamada triggerEvent é executada nos diferentes plugins de usuário (encontrados em plugins/user/ e chama o método onUserLogin, se existir. A função da tecla é aquela no plugin joomla. Estou copiando toda a função abaixo:

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 plug-in não verifica a senha (isso é feito pelos plug-ins de autenticação). Portanto, isso apenas verifica se o usuário não está bloqueado e pode efetuar login antes de definir os dados do usuário na sessão.

Esse armazenamento de sessão é a chave para mostrar ao usuário logado. Naturalmente, você poderia usar esse código diretamente, mas seria muito mais complicado do que deixar esse plug-in fazer o trabalho de verificar se o usuário não está bloqueado, armazenando suas informações na sessão e marcar o horário da última visita.

4
David Fritsch

Se você mudar isso, funcionará:

 JPluginHelper :: importPlugin ('usuário'); 
 $ Options = array (); 
 $ Options ['action'] = 'core.login.site'; 
 $ response = array (); // Adicione esta linha 
 $ Response ['language'] = ""; // Adicione esta linha 
 $ Response ['nomedeusuário'] = "nome_do_usuário_aqui"; // Altere esta linha 
 $ Result = $ app-> triggerEvent ('onUserLogin', array ((array) $ response, $ options)); 
0
Alireza Balvardi