私は、ログインページに行くことを決めた(または強制された)前に、ユーザーをリダイレクトするのに十分なスマートなログインシステムを実装しようとしています。
これと似た質問のように思える これです、および これですしかし、私の両方のシナリオには対処していません。
ここには2つのシナリオがあります:
ユーザーは特にログインページに行くことを決めました:
<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を表示せずに、このためのソリューションを実装するにはどうすればよいですか?
回答:
回答№1の場合は3セッションにリンク先URLを保存します。 私は、あなたが何らかの種類のアクセス事前ディスパッチプラグインを持っていると思います。それをしてください。次に、ログインフォームハンドラで、セッション内の宛先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()
常に「guest」が含まれます。これは認証されていないユーザーです。 Zend_Auth::hasIdentity(
)は false
.