2012-05-12 7 views
0

ACL을 허용하지 않는 역할을 특정 페이지로 리디렉션하도록하려면 아래의 코드를 사용하여 URL을 변경하지 않고 필요한 페이지로 사용자를 라우팅하여 정상적으로 작동하는 것이 문제입니다 . 따라서 사용자가 로그인하지 않고 관리 색인 페이지 (localhost/Admin)로 이동하려고하면 ACL 플러그 인이 사용자를 로그인 페이지로 이동 시키지만 URL은 변경하지 않습니다 (localhost/Admin/Login). 왜 이런 일이 일어나고 있는거야? Zend_controller_request_Abtract URL이 변경되지 않습니다.

class Hyderlib_Controller_Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract { 

    private $_acl = null; 
    private $_auth = null; 

    public function __construct(Zend_Acl $acl, Zend_Auth $auth) { 
     $this->_acl = $acl; 
     $this->auth = $auth; 
    } 

    public function preDispatch(Zend_Controller_Request_Abstract $request) { 
     $module = $request->getModuleName(); 
     $recourse = $request->getControllerName(); 
     $action = $request->getActionName(); 


     $identity = $this->auth->getStorage()->read(); 



     if (!isset($identity)) { 


      $role = 'default'; 
     } else { 
      $db = Zend_Db_Table::getDefaultAdapter(); 
      $Role = $db->select()->from('User_Account')->where('Email = ?', $identity); 
      $result = $db->fetchRow($Role); 
      $role = $result['Role']; 
     } 

     if (!$this->_acl->isAllowed($role, $module, $recourse, $action)) { 

      $request->setModuleName('Admin') 
        ->setControllerName('Login') 
        ->setActionName('index'); 
     } 

     //$role = $identity->Role; 
    } 

} 

나는 전체 코드를 보여주기 위해 제공하는이 모든 차이를 만들 경우 아래하여 preDispatch에 젠드 컨트롤러 플러그인에서 사용되는 코드입니다. 변경할 수있는 브라우저의 주소 표시 줄에 URL을 원하는 경우

$request->setModuleName('Admin') 
         ->setControllerName('Login') 
         ->setActionName('index'); 

답변

3

URL이 때문에 ZF MVC의 내부 리디렉션을 변경하지 않습니다. 하지만 그 좋은 점은 위의 답을 가지고 있다면 사용자가 admin 모듈의 로그인 컨트롤러에 대한 색인 작업을 허용하지 않는다면 리다이렉션의 무한 루프에 갇히게됩니다.

내부 리디렉션의 또 다른 장점은 사용자 로그인이 성공적으로 당신은 그가 실제로 확실히

$this->redirect($_SERVER['REQUEST_URI'); 
+0

것만으로 가고 싶어하는 URL로 그를 리디렉션 할 수 있습니다 때, 그것은 사용자가 그를 보낼 위해 편리 그의 그가 로그인 한 후에 의도 된 목적지에 도착했다. 그러나 나는 그 것을 세션에서 저장할 것이다. 로그인으로 리디렉션; 로그인에 성공하면 원하는 대상으로 리디렉션합니다. 이렇게하면, 자신의 위치 표시 줄에 표시된 URL은 실제로 그가 수행 한 기능을 반영합니다. 재 : 무한 리디렉션 루프 : 물론, 항상 위험. 하지만 일반적으로 로그인 페이지에서 ACL 제한을 제거/제외합니다. 결국 로그인 페이지가 그 것이다. –

1

, 당신은 (즉, 단순히 서버 측에서 $request 객체를 수정) 전달하지, (즉, 브라우저에 그 헤더를 보낼) 리디렉션합니다 .

그래서, 대신 :

$request->setModuleName('Admin') 
     ->setControllerName('Login') 
     ->setActionName('index'); 

시도 :

$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
$redirector->gotoSimpleAndExit('index', 'Login', 'Admin'); 
관련 문제