web-dev-qa-db-ja.com

ログイン後にユーザーをURLで指定されたページにリダイレクトする

Joomla 3.5.1では、次のような特定のページにユーザーをリダイレクトしたいと思います。

_https://www.domain.com/login?return=L2YlQzMlQjNydW0tcGVyZ3VudGFzLWUtcmVzcG9zdGFzL2NvbnZlcnNhdGlvbi9yZWFkLmh0bWw/aWQ9MjU=
_

文字列_?return=XXX_

URLの最後には、ログイン後にユーザーがどこに行く必要があるかが示されています。

https://docs.joomla.org/How_do_you_redirect_users_after_a_successful_login%3F

ただし、これは機能していません。ユーザーはプロフィールページにリダイレクトされています。

PS:私は_com_users_のオーバーライドを使用しています この別の質問に従ってください。

注:

_base64_decode(L2YlQzMlQjNydW0tcGVyZ3VudGFzLWUtcmVzcG9zdGFzL2NvbnZlcnNhdGlvbi9yZW‌​FkLmh0bWw/aWQ9MjU=) 
_

ユーザーのリダイレクト先のURLを返します。

注2:

以下に、オーバーライドで使用される_default_login.php_コード全体を示します。動いています。 if($_SERVER['QUERY_STRING'])がログイン前のページに完全にリダイレクトしているにもかかわらず、条件elseif($_SERVER['HTTP_REFERER']):が必要なURLにリダイレクトされないifステートメントの81〜88行目に注意してください。

_<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_users
 *
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.keepalive');
?> 
<div class="login<?php echo $this->pageclass_sfx?>">
    <?php if ($this->params->get('show_page_heading')) : ?>
    <div class="page-header">
        <h1>
            <?php echo $this->escape($this->params->get('page_heading')); ?>
        </h1>
    </div>
    <?php endif; ?>

    <?php if (($this->params->get('logindescription_show') == 1 && str_replace(' ', '', $this->params->get('login_description')) != '') || $this->params->get('login_image') != '') : ?>
    <div class="login-description">
    <?php endif; ?>

        <?php if ($this->params->get('logindescription_show') == 1) : ?>
            <?php echo $this->params->get('login_description'); ?>
        <?php endif; ?>

        <?php if (($this->params->get('login_image') != '')) :?>
            <img src="<?php echo $this->escape($this->params->get('login_image')); ?>" class="login-image" alt="<?php echo JText::_('COM_USERS_LOGIN_IMAGE_ALT')?>"/>
        <?php endif; ?>

    <?php if (($this->params->get('logindescription_show') == 1 && str_replace(' ', '', $this->params->get('login_description')) != '') || $this->params->get('login_image') != '') : ?>
    </div>
    <?php endif; ?>

    <form action="<?php echo JRoute::_('index.php?option=com_users&task=user.login'); ?>" method="post" class="form-validate form-horizontal well">

        <fieldset>
            <?php foreach ($this->form->getFieldset('credentials') as $field) : ?>
                <?php if (!$field->hidden) : ?>
                    <div class="control-group">
                        <div class="control-label">
                            <?php echo $field->label; ?>
                        </div>
                        <div class="controls">
                            <?php echo $field->input; ?>
                        </div>
                    </div>
                <?php endif; ?>
            <?php endforeach; ?>

            <?php if ($this->tfa): ?>
                <div class="control-group">
                    <div class="control-label">
                        <?php echo $this->form->getField('secretkey')->label; ?>
                    </div>
                    <div class="controls">
                        <?php echo $this->form->getField('secretkey')->input; ?>
                    </div>
                </div>
            <?php endif; ?>

            <?php if (JPluginHelper::isEnabled('system', 'remember')) : ?>
            <div  class="control-group">
                <div class="control-label"><label><?php echo JText::_('COM_USERS_LOGIN_REMEMBER_ME') ?></label></div>
                <div class="controls"><input id="remember" type="checkbox" name="remember" class="inputbox" value="yes"/></div>
            </div>
            <?php endif; ?>

            <div class="control-group">
                <div class="controls">
                    <button type="submit" class="btn btn-primary">
                        <?php echo JText::_('JLOGIN'); ?>
                    </button>
                </div>
            </div>

            <?php if($_SERVER['QUERY_STRING']):
                $retorno=$_SERVER['QUERY_STRING'];
                $retorno=(str_replace('return=', '', $retorno)); ?>
                <input type="hidden" name="redirect" value="<?php echo urlencode(base64_encode($retorno));?>" />

            <?php elseif($_SERVER['HTTP_REFERER']): ?>
                <input type="hidden" name="return" value="<?php echo base64_encode($_SERVER['HTTP_REFERER']);?>" />
            <?php endif; ?>

            <?php echo JHtml::_('form.token'); ?>
        </fieldset>
    </form>
</div>
<div>
    <ul class="nav nav-tabs nav-stacked">
        <li>
            <a href="<?php echo JRoute::_('index.php?option=com_users&view=reset'); ?>">
            <?php echo JText::_('COM_USERS_LOGIN_RESET'); ?></a>
        </li>
        <li>
            <a href="<?php echo JRoute::_('index.php?option=com_users&view=remind'); ?>">
            <?php echo JText::_('COM_USERS_LOGIN_REMIND'); ?></a>
        </li>
        <?php
        $usersConfig = JComponentHelper::getParams('com_users');
        if ($usersConfig->get('allowUserRegistration')) : ?>
        <li>
            <a href="<?php echo JRoute::_('index.php?option=com_users&view=registration'); ?>">
                <?php echo JText::_('COM_USERS_LOGIN_REGISTER'); ?></a>
        </li>
        <?php endif; ?>
    </ul>
</div>
_
5
Nuno Nogueira
  1. まず、com_usersログインはPOSTメソッドを使用するように記述されているため、_?return=_を追加しても何も得られず、機能しません。

  2. Postデータでreturnを指定しない場合、モデルはプロファイルへのデフォルトのポインティングを使用します。

  3. リターンは私を内部にする必要があります。外部URLにリダイレクトしないでください。リダイレクトすると、デフォルトでプロファイルリダイレクトによって上書きされます。

  4. ビューの部分で、ログインにポイントされているメニューにいるかどうかをjoomlaが確認し、ログインしている場合は、「Login redirect」パラメータを設定してリダイレクトをポイントできます。パラメータの説明:

    • ログインのリダイレクト。ここにURLを入力すると、ユーザーはログイン後にそのURLにリダイレクトされます。 URLは外部のものであってはなりません。
  5. この後、returnはreturnのフォーム値に設定されます。

コードの私の観点からは、テンプレートのオーバーライドを作成することは良いことですが、内部リンクを使用することを忘れないでください。これは_JUri::isInternal_検証に合格できます。

編集:returnの適切な使用:<input type="hidden" name="return" value="<?php echo base64_encode('index.php?option=com_mycomponent&view=myview'); ?>"/>

編集2:RemberはJRouteを使用することはありませんが、有効な内部URLではありません... index.phpのみ

例:

_<?php
        /**
         * Return Override  -   START
         */
        // grab old form Return Value
        $form_return = $this->form->getValue('return');
        $new_return = 'index.php?option=com_mycomponent&view=myview';
        ?>
        <input type="hidden" name="return" value="<?php echo base64_encode($this->params->get('login_redirect_url', $new_return)); ?>" />
        <?php
        /**
         * Return Override  -   End
         */
        ?>
_

家でこれを試してみてください。 ; )

6
Lanah

正確な答えを得るには、もう少し詳しく説明する必要があると思いますが、次のようにすることをお勧めします。

  1. 上書きファイルにテキストを追加して、実際にそのファイルを使用してログインを作成していることを確認します。他の質問で与えられた例は、ログインモジュールではなくユーザーコンポーネントをオーバーライドすることに注意してください。ログインモジュールを使用している場合は、代わりにそれをオーバーライドする必要があります。
  2. エコーして戻りフィールドの値をスクリーニングします。つまり、<input type="hidden" name="return" value="<?php echo base64_encode($_SERVER['HTTP_REFERER']); ?>" />を使用している場合は、echo $_SERVER['HTTP_REFERER'];画面に-それが正しいURLであることを確認します。

それでも問題が解決しない場合は、オーバーライドファイルの内容を質問に追加します。

(また、余談ですが、パッチの適用は重要であり、3.4.5は古くなっていますが、これはそれに関するバグではないと思います)

更新:

問題は、JoomlaフレームワークのJInputではなく$ _SERVER ['QUERY_STRING'])を使用してURLパラメータを取得していることである可能性があります。

参照: https://docs.joomla.org/Retrieving_request_data_using_JInput

また、base_64でエンコードされたものにそのurlencodeは必要ありません。

さらに、特定のページにリダイレクトしたいとおっしゃっていましたが、戻り値が動的になるようにこれを行っているようです。

Lanahはまた、$ _ SERVER ['HTTP_REFERER']がgoogle.comを指すか、ページに直接アクセスした場合は空になる可能性があることを指摘しました。この問題が解決された場合に、このような場合のために追加の検証を追加することができます。

1
Richard B

私は管理者セクションで同様のことをしています。ログイン後にユーザーを特定のコンポーネントURLにリダイレクトします: https://github.com/blackbricksoftware/joomla-adminredirect

ユーザープラグインのonUserAfterLoginメソッドにフックするプラグインが必要です。上記のプラグインの例のメインファイルを次のように置き換えます。

<?php defined('_JEXEC') or die;

// http://docs.joomla.org/Plugin/Events/System
// http://docs.joomla.org/J2.5:Creating_a_System_Plugin_to_augment_JRouter
// http://docs.joomla.org/J3.x:Creating_a_Plugin_for_Joomla

class PlgUserAdminRedirect extends JPlugin {

    public function __construct(&$subject, $config) {

        parent::__construct($subject, $config); 
    }

    public function onUserAfterLogin() {

        $app = JFactory::getApplication(); 
        $return = $app->input->getBase64('return');

        if (empty($return)) return;

        $app->redirect(JRoute::_($redirecturl,false));
    }
}
0
David Hayes