it-swarm.dev

Accesso utente senza ottenere password da loro

Il mio requisito è qualcosa di simile al login da Facebook, quindi l'utente non fornisce la password ma viene effettuato l'accesso. Voglio fare un utente connesso all'interno del codice di estensione conoscendo il suo user id and/or username but not password.

Come lo faccio? Ho anche cercato di ottenere la password crittografata dell'utente dal database e di inserire il nome utente e quella password nel metodo login () e poi qualcosa è andato storto, ottenendo username and password mismatch error, sebbene abbia effettuato l'accesso!

Ho anche trovato alcuni codici da Google -

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

Sembra funzionare, ma non so se ci sia alcuna possibilità che ciò si sbagli in seguito quando lo si fa in entrambe le versioni 2.5 e 3.0.

6
dev-m

Per quanto ne so, nessuna parte di questo è obsoleta, quindi questo codice dovrebbe sicuramente continuare a funzionare correttamente nelle installazioni 2.5 e 3.0. Anche se qualcosa viene deprecato, dovresti essere in grado di eseguirlo almeno attraverso la versione 4.0.

Detto questo, nessuno di questi pezzi è probabile che venga rimosso. Stai importando i plugin utente e quindi attivando l'evento onUserLogin. Questo è il metodo standard per attivare i plugin, quindi dovrebbe essere coerente per un po '.

L'unico altro pezzo da ricordare è che stai minando la sicurezza di richiedere a un utente di accedere con la propria password. Assicurati che anche il pezzo che stai usando per sostituire sia sicuro.


Aggiornamento per commento

La chiamata triggerEvent viene eseguita attraverso i diversi plug-in utente (disponibile in plugins/user/ e chiama il metodo onUserLogin se esiste. La funzione chiave è quella nel plugin joomla. Sto copiando l'intera funzione di seguito:

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

Questo plugin non controlla affatto la password (che viene eseguita dai plugin di autenticazione). Quindi, questo controlla principalmente che l'utente non sia bloccato e può accedere prima di impostare i dati dell'utente nella sessione.

L'archiviazione della sessione è la chiave per mostrare l'utente come connesso. Naturalmente potresti semplicemente usare questo codice direttamente, ma in realtà sarebbe molto più complicato che lasciare che questo plugin faccia il lavoro per verificare che l'utente non sia bloccato, archiviando le loro informazioni nella sessione e segnando l'ora dell'ultima visita.

4
David Fritsch

Se lo cambi, funzionerà:

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