web-dev-qa-db-ja.com

ユーザーからパスワードを取得せずにユーザーをログインさせる

私の要件はFacebookによるログインのようなものなので、ユーザーはパスワードを提供せずにログインします。ユーザーにuser id and/or username but not passwordを知らせて、拡張コード内からログインさせる必要があります。

それ、どうやったら出来るの?また、データベースからユーザーの暗号化されたパスワードを取得し、ユーザー名とそのパスワードをlogin()メソッドに入れようとしたところ、ログインに失敗しましたが、username and password mismatch errorが取得されました。

私はグーグルからいくつかのコードも見つけました-

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

動作しているようですが、2.5と3.0の両方のバージョンでこれを行うときに、後で問題が発生する可能性があるかどうかはわかりません。

6
dev-m

私の知る限り、これは非推奨ではないので、このコードは間違いなく2.5および3.0のインストールで正しく機能し続けるはずです。何かが非推奨になったとしても、少なくともバージョン4.0まではこれを実行できるはずです。

そうは言っても、これらの部分はどれも削除されそうにありません。ユーザープラグインをインポートしてから、onUserLoginイベントをトリガーしています。これはプラグインをトリガーする標準的な方法であるため、しばらくの間一貫している必要があります。

他に覚えておかなければならない唯一の部分は、ユーザーにパスワードでのログインを要求するというセキュリティを弱体化していることです。交換に使用している部品も安全であることを確認してください。


コメントごとに更新

triggerEvent呼び出しは、さまざまなユーザープラグイン(plugins/user/が存在する場合は、onUserLoginメソッドを呼び出します。重要な機能は、joomlaプラグインの機能です。以下の関数全体をコピーしています:

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

このプラグインは、パスワードをまったくチェックしません(認証プラグインによって行われます)。したがって、これはほとんどの場合、ユーザーがブロックされておらず、ユーザーのデータをセッションに設定する前にログインできることを確認するだけです。

そのセッションストレージは、ログインしているユーザーを表示するための鍵です。当然、このコードを直接使用することもできますが、実際には、このプラグインにユーザーがブロックされていないことを確認する作業を実行させるよりもはるかに複雑です。セッションでの彼らの情報、そして最後の訪問時間をマークします。

4
David Fritsch

これを変更すると動作します:

 JPluginHelper :: importPlugin( 'user'); 
 $ options = array(); 
 $ options ['action'] = 'core.login.site'; 
 $ response = array(); //この行を追加します
 $ response ['language'] = ""; //この行を追加します
 $ response ['username'] = "user_name_here"; //この行を変更します
 $ result = $ app-> triggerEvent( 'onUserLogin'、array((array)$ response、$ options)); 
0