web-dev-qa-db-fra.com

Rediriger les utilisateurs vers la page indiquée dans l'URL après la connexion

Dans Joomla 3.5.1, je souhaite rediriger les utilisateurs vers une page spécifique, telle que:

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

Où la chaîne ?return=XXX

À la fin de l'URL est censé indiquer où l'utilisateur doit aller après la connexion, conformément à:

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

Toutefois, cela ne fonctionne pas: les utilisateurs sont redirigés vers la page de profil.

PS: J'utilise un remplacement pour com_users Selon cette autre question.

NOTE:

base64_decode(L2YlQzMlQjNydW0tcGVyZ3VudGFzLWUtcmVzcG9zdGFzL2NvbnZlcnNhdGlvbi9yZW‌​FkLmh0bWw/aWQ9MjU=) 

Renvoie l'URL vers laquelle les utilisateurs devraient être redirigés.

NOTE2:

Vous trouverez ci-dessous l'intégralité du code default_login.php Utilisé dans le remplacement. Ça fonctionne. Remarquez sur les lignes 81 à 88 de l'instruction if où la condition if($_SERVER['QUERY_STRING']) n'est PAS redirigée vers l'URL souhaitée, bien que elseif($_SERVER['HTTP_REFERER']): fonctionne parfaitement en redirigeant vers la page précédente.

<?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. Tout d'abord, le login de com_users est écrit pour utiliser la méthode POST, donc ajouter ?return= Ne vous donne rien, cela ne fonctionnera pas.

  2. Si nous ne spécifions pas de retour dans les données de post, model utilisera le pointage par défaut dans le profil.

  3. Retour doit me faire un interne. Ne redirigez pas vers une URL externe, sinon la redirection du profil sera écrasée.

  4. Dans la partie vue, joomla vérifie si vous êtes dans le menu pointé en connexion, si vous êtes, vous pouvez définir un paramètre "Login redirect" pour pointer la redirection. Description des paramètres:

    • Login Redirect, si une URL est entrée ici, les utilisateurs y seront redirigés après la connexion. L'URL ne doit pas être externe.
  5. Après tout cela, return est défini dans la valeur de formulaire de return.

Donc, de mon point de vue du code, créer un remplacement de modèle est une bonne chose, mais n'oubliez pas d'utiliser des liens internes. Cela peut réussir la validation JUri::isInternal.

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

EDIT 2: Rember n'utilise jamais JRoute en retour ce n'est pas une URL interne valide ... uniquement index.php

Exemple:

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

Alors essayez ceci à la maison, je vous défie! ; )

6
Lanah

Je pense que vous devrez donner un peu plus de détails pour obtenir une réponse exacte, mais je suggère de procéder comme suit.

  1. Ajoutez du texte à votre fichier de substitution afin de vous assurer qu'il l'utilise réellement pour créer votre identifiant. Notez que l'exemple donné dans l'autre question remplace le composant utilisateurs plutôt que le module de connexion. Si vous utilisez le module de connexion, vous devrez le remplacer.
  2. Echo pour filtrer la valeur du champ de retour, c’est-à-dire si vous utilisez <input type="hidden" name="return" value="<?php echo base64_encode($_SERVER['HTTP_REFERER']); ?>" />, écrivez echo $_SERVER['HTTP_REFERER']; à l'écran - assurez-vous que c'est la bonne URL.

Si cela ne fonctionne pas, j'ajouterai le contenu de votre fichier de substitution à votre question, car cela pourrait donner plus de gens à continuer.

(En outre, à titre de correction - la correction est importante et la version 3.4.5 est périmée, bien que je ne pense pas que ce soit un bogue relatant cela)

Mise à jour:

Le problème peut être que vous utilisez $ _SERVER ['QUERY_STRING']) plutôt que le JInput du Joomla Framework pour obtenir vos paramètres d'URL.

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

Vous n'avez également pas besoin de ce code urlencode sur quelque chose encodé en base_64.

De plus, vous avez dit que vous vouliez rediriger vers une page spécifique, mais que vous semblez le faire comme si la valeur de retour devait être dynamique.

Lanah a également souligné que $ _SERVER ['HTTP_REFERER'] peut pointer sur google.com ou être vide si vous accédez directement à la page. Vous voudrez peut-être ajouter une validation supplémentaire pour de telles occasions lorsque ce problème est résolu.

1
Richard B

Je fais quelque chose de similaire sur les sections de l'administrateur. Je redirige les utilisateurs vers une URL de composant spécifique après la connexion: https://github.com/blackbricksoftware/joomla-adminredirect .

Vous avez besoin d’un plugin pour vous connecter à la méthode onUserAfterLogin d’un plugin utilisateur. Remplacez le fichier principal dans l'exemple ci-dessus par quelque chose comme ceci:

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