Вот как я это делаю с реферером
У меня есть 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') );
}
Надеюсь, это работает для вас.