Вот как я это делаю с реферером
У меня есть 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