web-dev-qa-db-pt.com

Redirecionar usuários para a página apontada no URL após o login

No Joomla 3.5.1, quero redirecionar os usuários para uma página específica, como:

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

Onde a string ?return=XXX

No final do URL, deve indicar para onde o usuário deve ir após o login, conforme:

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

No entanto, isso não está funcionando: os usuários estão sendo redirecionados para a página de perfil.

PS: Estou usando uma substituição para com_users Conforme essa outra pergunta.

NOTA:

base64_decode(L2YlQzMlQjNydW0tcGVyZ3VudGFzLWUtcmVzcG9zdGFzL2NvbnZlcnNhdGlvbi9yZW‌​FkLmh0bWw/aWQ9MjU=) 

Retorna a URL para a qual os usuários devem ser redirecionados.

NOTA 2:

Abaixo, você pode encontrar todo o código default_login.php Usado na substituição. Está funcionando. Observe nas linhas 81-88 na instrução if em que a condição if($_SERVER['QUERY_STRING']) NÃO está redirecionando para o URL que desejo, embora elseif($_SERVER['HTTP_REFERER']): esteja funcionando perfeitamente redirecionando para a página em que estavam antes de efetuar login.

<?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. Primeiro de tudo, o login com_users é gravado para usar o método POST, portanto, adicionar ?return= Não oferece nada, não funcionará.

  2. Se não especificarmos o retorno nos dados da postagem, o modelo usará o apontador padrão no perfil.

  3. Retorno deve me um interno. Não redirecione para um URL externo ou ele será substituído por padrão, redirecionamento de perfil.

  4. Em parte de vista, o joomla verifica se você está no menu apontado para o login, se estiver, você pode definir um parâmetro "Login redirect" para apontar o redirecionamento. Descrições de parâmetros:

    • Redirecionamento de login. Se um URL for inserido aqui, os usuários serão redirecionados a ele após o login. O URL não deve ser externo.
  5. Depois de tudo isso, o retorno é definido no valor do formulário de retorno.

Portanto, da minha perspectiva do código, a criação de substituição de modelo é boa, mas lembre-se de usar links internos. Isso pode passar na validação JUri::isInternal.

EDIT: bom uso do retorno: <input type="hidden" name="return" value="<?php echo base64_encode('index.php?option=com_mycomponent&view=myview'); ?>"/>

EDIT 2: Rember nunca usa o JRoute em troca, não é um URL interno válido ... apenas index.php

Exemplo:

<?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
         */
        ?>

Então tente isso em casa, eu te desafio! ; )

6
Lanah

Acho que você precisará fornecer um pouco mais de detalhes para obter uma resposta exata, mas sugiro fazer o seguinte.

  1. Adicione algum texto ao seu arquivo de substituição para garantir que ele esteja realmente usando esse arquivo para criar seu login. Observe que o exemplo dado na outra pergunta substitui o componente users em vez do módulo de login. Se você estiver usando o módulo de login, será necessário substituí-lo.
  2. Eco para selecionar o valor do campo de retorno, ou seja, se você estiver usando <input type="hidden" name="return" value="<?php echo base64_encode($_SERVER['HTTP_REFERER']); ?>" />, em seguida, escreva echo $_SERVER['HTTP_REFERER']; para tela - verifique se é o URL certo.

Se isso não funcionar, eu adicionaria o conteúdo do seu arquivo de substituição à sua pergunta, pois isso pode dar às pessoas mais para continuar.

(Além disso, como um remendo aparte é importante e o 3.4.5 está desatualizado, embora eu não acredite que seja um bug relacionado a isso)

Atualizar:

O problema pode ser que você esteja usando $ _SERVER ['QUERY_STRING']) em vez do JInput do Joomla Framework para obter seus parâmetros de URL.

Veja: https://docs.joomla.org/Retrieving_request_data_using_JInput

Você também não precisa desse código de URL em algo que está sendo codificado em base_64.

Além disso, você disse que queria redirecionar para uma página específica, mas parece estar fazendo isso como se o valor de retorno fosse dinâmico.

Lanah também apontou que $ _SERVER ['HTTP_REFERER'] pode apontar para google.com ou ficar vazio se você acessar a página diretamente. Convém adicionar validação adicional para ocasiões em que esse problema é resolvido.

1
Richard B

Eu faço algo semelhante nas seções de administrador. Eu redireciono os usuários para um URL de componente específico após o login: https://github.com/blackbricksoftware/joomla-adminredirect .

Você precisa de um plug-in para se conectar ao método onUserAfterLogin de um plug-in de usuário. Substitua o arquivo principal no exemplo de plug-in acima por algo como isto:

<?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