1

アクションを実行する前にログインする必要がある管理者 webapp.one があります。現在、/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".at があり、ログイン ページからのものと思われる 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 に答える