Я намагаюся реалізувати систему входу, яка буде досить розумною, щоб перенаправити користувача назад на сторінку, на якій вони були, перш ніж вони вирішили (або змушені були) перейти на сторінку входу.
Я знаю, це схоже на подібне питання цей, і цей, але вони не стосуються обох моїх сценаріїв.
Тут є два сценарії:
Користувач спеціально вирішує перейти на сторінку входу:
<a href="<?php echo $this->url(array( "controller"=>"auth", "action"=>"login"), "default", true); ?>">Log In</a>
Користувача переспрямовано, оскільки він намагався отримати доступ до захищеного вмісту:
if (!Zend_Auth::getInstance()->hasIdentity()) { $this->_helper->redirector("login", "auth"); }
Як я можу реалізувати рішення для цього, не відображаючи URL-адреса "переспрямування" в адресний рядок?
Відповіді:
3 для відповіді № 1Збережіть цільову URL-адресу в сеансі. Я думаю, у вас є якийсь плагін для попереднього відправлення доступу. Зробіть це там. А потім у обробнику форми для входу перевіряйте цільову URL-адресу в сеансі та переспрямовуйте на неї після успішної аутентифікації.
Приклад коду з мого проекту:
class Your_Application_Plugin_Access extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
foreach (self::current_roles() as $role) {
if (
Zend_Registry::get("bootstrap")->siteacl->is_allowed(
$role,
new Site_Action_UriPath($request->getPathInfo())
)
) return; // Allowed
}
$this->not_allowed($request);
}
private function not_allowed(Zend_Controller_Request_Abstract $request) {
$destination_url = $request->getPathInfo();
// If the user is authenticted, but the page is denied for his role, show 403
// else,
// save $destination_url to session
// redirect to login page, with $destination_url saved:
$request
->setPathInfo("/login")
->setModuleName("default")
->setControllerName("login")
->setActionName("index")
->setDispatched(false);
}
...
}
Тут current_roles()
завжди містить "гість", який є неавторизованим користувачем, для якого Zend_Auth::hasIdentity(
) є false
.