Вернуть пользователя на предыдущую страницу после входа в систему?

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

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

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. Я хочу перенаправить туда, где они были до этого. Имеет ли это смысл?


person JD Isaacks    schedule 25.01.2011    source источник


Ответы (6)


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

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

person Flavius Stef    schedule 25.01.2011
comment
Технически реферер всегда будет страницей входа, потому что они переходят на /signin, а затем отправляют форму входа. Таким образом, в момент отправки формы реферер всегда /signin. Я хочу перенаправить туда, где они были до этого. Имеет ли это смысл? - person JD Isaacks; 25.01.2011

лучший способ - использовать компонент аутентификации тортов и позволить ему делать то, что он делает... http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#AuthComponent%3a%3a%24loginRedirect

person dogmatic69    schedule 26.01.2011

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

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

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

Итак, я добавляю некоторую логику для проверки, чтобы убедиться, что реферер не является страницей входа. Кроме того, я добавляю еще одну логику для хранения $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') );
}

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

person pijnoh    schedule 18.09.2011

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

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

person Johan    schedule 25.01.2011

Используйте AppController и UsersController для его настройки.

В AppController действие перед фильтром

$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());                 
 }
}
person Pankaj Kumar    schedule 11.08.2017

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-адрес перенаправления действительным URL-адресом? и это перенаправление на мой домен или внешний домен?.

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

person mattspain    schedule 05.01.2016