1

我有一个管理员 webapp。在执行任何操作之前必须先登录。现在 /default/index/index 具有登录表单,它是一个 ExtJs 组件。基本上登录过程是一个 ajax 进程。我创建了一个插件来禁用渲染和布局并检查用户是否登录(还没有完整的 acl)。

这是代码:

 public function  preDispatch(Zend_Controller_Request_Abstract $request) {
    parent::preDispatch($request);

    if($request->isXmlHttpRequest()){
        $ViewHelper = Zend_Controller_Action_HelperBroker::getStaticHelper("ViewRenderer");
        $ViewHelper->setNoRender(true);
        Zend_Layout::getMvcInstance()->disableLayout();

    }


    $module = $request->getModuleName();
    $controller = $request->getControllerName();
    $action = $request->getActionName();

    if(!Zend_Auth::getInstance()->hasIdentity()){
        $url = "/".$module."/".$controller."/".$action;
          $session = new Zend_Session_Namespace("myapp.auth");
        $session->requestURL = $url;
        $request->setModuleName("default");
        $request->setControllerName("index");
        $request->setActionName("index");
        $request->setDispatched();

    }
}

这似乎可行,但地址栏仍然有原始请求 url。例如,我输入"myapp/admin/cpanel"了 url 栏,它在浏览器上打开登录页面,而地址栏仍然有"myapp/admin/cpanel"。此时登录失败,因为输出有一些 html 渲染,我相信来自登录页面(已经直接击中时工作正常)。

以前有没有人经历过,或者只是我做错了什么。如果你能分享你的经验,我会很高兴。

感谢您阅读本文。

4

1 回答 1

2

这似乎可行,但地址栏仍然有原始请求 url。例如,我在 url 栏中输入了“myapp/admin/cpanel”,它会在浏览器上打开登录页面,而地址栏仍然有“myapp/admin/cpanel”。

如果您不喜欢这种行为,您可能需要考虑将用户重定向到登录表单,而不是在每个控制器之前处理登录。如果您的登录页面此时实际上可以访问,这应该像编写一样简单:

<?php
public function  preDispatch(Zend_Controller_Request_Abstract $request) {
    parent::preDispatch($request);

    if($request->isXmlHttpRequest()){
        $ViewHelper = Zend_Controller_Action_HelperBroker::getStaticHelper("ViewRenderer");
        $ViewHelper->setNoRender(true);
        Zend_Layout::getMvcInstance()->disableLayout();
    }

    $module = strtolower( $request->getModuleName( ) );
    $controller = strtolower( $request->getControllerName( ) );
    $action = strtolower( $request->getActionName( ) );

    /** Check to see if the controller is already the login controller to prevent an endless loop. */
    //corrected if(!array( 'default', 'index', 'index' ) === array()) to if(array( 'default', 'index', 'index' ) !== array())
    if( ( array( 'default', 'index', 'index' ) !== array( $module, $controller, $action ) ) {

        if( !Zend_Auth::getInstance()->hasIdentity( ) ) {
            $url = "/".$module."/".$controller."/".$action;
              $session = new Zend_Session_Namespace("myapp.auth");
            $session->requestURL = $url;
            $this->getResponse()->setRedirect( '/' )->sendResponse( );
        }
    }
}

虽然我无法测试它,但想法应该很清楚。

于 2011-01-18T14:00:27.500 回答