Вернуть пользователя на предыдущую страницу после входа в систему? - PullRequest
3 голосов
/ 25 января 2011

У меня есть контроллер, который называется Учетные записи, с входом и выходом из представлений.

Соответствующие функции выглядят так:

function signin()
{
    if (!empty($this->data)) 
    {
        //handle login
        ...
        //save login to session
        $this->Session->write('Account',  $data["Account"]);
        //redirect to previous page
        ???
    }
}

function signout()
{
    //delete login
    $this->Session->delete('Account');
    //redirect to previous page
    ??? 
}

Если пользователь переходит на accounts/signin, он сначала проверяетчтобы увидеть, если форма отправлена ​​if(!empty($this->data)), если да, она регистрирует их, если нет, она отображает форму входа.Если они успешно войдут в систему, я хочу перенаправить их на страницу, на которой они находились до страницы входа.

Какой лучший способ сделать это?

Редактировать:

Я не думаю, что могу использовать обычного http-реферера, потому что технически реферер всегда будет входить на страницу входа, потому что они переходят на /signin, а затем отправляют форму входа.Таким образом, в точке, где форма отправлена, реферер всегда равен /signin.Я хочу перенаправить туда, где они были до этого.Имеет ли это смысл?

Ответы [ 6 ]

2 голосов
/ 18 сентября 2011

Вот как я это делаю с реферером

У меня есть 2 формы входа, одна из которых находится в верхней части всех страниц для простого входа, другая - при входе в систему.Если пользователь входит с помощью формы сверху, отправка формы затем переходит на страницу входа, и вы можете использовать $this->referer() для перенаправления пользователя обратно.

Но проблема в том, что, если пользователь вводитпароль неверный или введите неверные учетные данные, после чего он окажется на странице входа.Если он затем вводит правильное имя пользователя + пароль, и перенаправление происходит с помощью $this->referer(), который в этом случае является сам.Затем пользователь мог бы либо 1. снова перенаправить обратно на страницу входа в систему, либо 2. что еще хуже может застрять в бесконечном цикле, так как логин будет продолжать перенаправлять сам на себя.

Итак, я добавляю логику, чтобы убедиться, что referer не является страницей входа.Кроме того, я добавляю еще одну логику для хранения $this->referer() при первом входе пользователя на страницу входа в систему, мы знаем, где именно находится страница перед страницей входа.

Чтобы сохранить страницу перед страницей входа, поместите этот код вконец действия (рендеринг представления входа в систему должен начаться)

//get the current url of the login page (or current controller+action)
$currentLoginUrl = strtolower( "/" .$this->name ."/" .$this->action );
if( $this->referer() != $currentLoginUrl  )
{
    //store this value to use once user is succussfully logged in
    $this->Session->write('beforeLogin_referer', $this->referer($this->Auth->redirect(), true)) ) ;  //if referer can't be read, or if its not from local server, use $this->Auth->rediret() instead
}

Теперь поместите код для перенаправления в ту часть кода, где аутентификация прошла успешно (или в if( $this->Auth->user() ){ }):

//get the login page url again (by gettting its controller, or plural of Model, and this current page action and make the url)
$currentLoginUrl = strtolower( "/" .$this->name ."/" .$this->action );

//if the referer page is not from login page, 
if( $this->referer() != $currentLoginUrl  )
{
    //use $this->referer() right away
    $this->redirect($this->referer($this->Auth->redirect(), true));  //if referer can't be read, or if its not from local server, use $this->Auth->rediret() instead
}
else
{
    //if the user lands on login page first, rely on our session 
    $this->redirect( $this->Session->read('beforeLogin_referer') );
}

Надеюсь, это работает для вас.

2 голосов
/ 26 января 2011

лучший способ - использовать компонент Cakes Auth и позволить ему делать то, что он делает ... http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#AuthComponent::$loginRedirect

1 голос
/ 25 января 2011

Я не знаю, как лучше, но я сохраняю получателя в переменной сеанса, прежде чем перенаправить их на страницу входа.

Как только они войдут в систему, я перенаправлю их в сохраненный пункт назначения.

1 голос
/ 25 января 2011

http://book.cakephp.org/view/430/referer

Используйте скрытое поле <input>, которое содержит начальный реферер и отправляется с данными для входа.

0 голосов
/ 11 августа 2017

Используйте AppController и UsersController, чтобы установить его

В AppController beforeFilter action

$referer = Router::url($this->url, true);
$this->Auth->loginAction = array('controller'=>'users','action'=>'login','?'=>['referer'=>$referer]);

В UsersController Действие входа

if($this->Auth->login())
{
 $this->Session->setFlash(__('Logged in successfully !'));
$redirect = $this->request->query('referer');
if(!empty($redirect))
 {
   return $this->redirect($this->Auth->redirectUrl($redirect));
 }else{
    return $this->redirect($this->Auth->redirectUrl());                 
 }
}
0 голосов
/ 05 января 2016

CakePHP 2.x здесь

1.Редактировать AppController.php

public function beforeFilter() {
        // redirect url
        if($this->request->here!= '/users/login') {
            $user_id = AuthComponent::user('id');
            if(empty($user_id)) { $this->Session->write('redirect_url_after_login', Router::url($this->request->here, true)); }
}

Это будет хранить URL-адрес, который пользователь хотел перейти до запроса, только если URL-адрес не / users / login (замените своим URL-адресом входа) И если ни один пользователь не вошел.

2.Отредактируйте форму входа.Мой был Users / login.ctp.Добавьте скрытое поле, только если установлена ​​переменная сеанса.

    $redirect_url_after_login = $this->Session->read('redirect_url_after_login');
    if(!empty($redirect_url_after_login))
        echo $this->Form->input('redirect_url_after_login', ['value'=>$redirect_url_after_login, 'type'=>'hidden']);

3.В вашем действии входа в систему добавьте действие, чтобы перезаписать переменную loginRedirect, которую вы, возможно, установили ранее.

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            $redirect_url_after_login = $this->request->data['User']['redirect_url_after_login'];
            if(!empty($redirect_url_after_login)
                &&filter_var($redirect_url_after_login, FILTER_VALIDATE_URL)
                &&parse_url($redirect_url_after_login, PHP_URL_HOST)==$_SERVER['HTTP_HOST'])
                    return $this->redirect($redirect_url_after_login);
            $this->Session->delete('redirect_url_after_login');
            return $this->redirect($this->Auth->redirect());

}

Я добавил пару проверок безопасности, например:действительный URL? "и «это перенаправление на мой домен или внешний домен?».

Примечание: я знаю, что проверка $_SERVER['HTTP_HOST'] не пуленепробиваема, но здесь мы говорим о предотвращении уязвимости открытого перенаправления, поэтому этого достаточно.

...