2011-01-18 4 views
1

모든 web.appone이 로그인해야만 action.Now/default/index/index에 로그인 양식이 있습니다. ExtJs 기본적으로 로그인 프로세스는 아약스입니다. 렌더링 및 레이아웃을 사용하지 않도록 설정하고 사용자가 로그인했는지 여부를 확인하는 플러그인을 만들었습니다 (아직 풀 ACL이 없습니다).전체 URL 변경으로 Zend_Controller_Plugin_Abstract 리디렉션이 어떻게 작동합니까? Zend_layout이 레이아웃을 사용하지 못하게합니다.

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을 갖고있는 것 같아요 : 여기

는 코드입니다. 예를 들어, URL 막대에 "myapp/admin/cpanel"을 입력했는데 주소 표시 줄에 여전히 "myapp/admin/cpanel" .at가있는 동안 로그인 페이지가 열립니다. 출력에 로그인 페이지에서 보낸 일부 HTML 렌더링이 있기 때문에 로그인이 실패합니다. 직접 맞았을 때 잘 작동합니다).

누구나 전에 경험했거나 잘못하고있는 사람이 있습니까?이 경험을 공유 할 수 있다면 기쁘게 생각합니다.

감사합니다.

답변

2

이것은 작동하지만 주소 표시 줄에는 여전히 원래 요청이 있습니다. 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(); 
     } 
    } 
} 

그래도 난 그것을 테스트 할 수 아니지만, 생각은 명확해야한다 : 당신의 로그인 페이지가 순간에 실제로 액세스 할 수있는 경우,이 서면으로 사소한해야한다.

+0

안녕하십니까! 나는 당신이 잠시 동안 제안 할 것이라고 생각한다. 한 typo는'if ((array ('default', 'index', 'index')! == 배열 ($ module, $ controller, $ action) ($ module, $ controller, $ action))''신원을 확인하십시오 "감사합니다. –