2012-05-12 40 views
0

我使用下面的代码使ACL不允许被重定向到特定页面的角色,问题在于它通过将用户路由到所需的页面而不需要更改URL 。因此,假设用户正在尝试在未登录的情况下转到管理索引页面(localhost/Admin),则ACL插件将将用户路由到登录页面,但不更改URL(localhost/Admin/Login)。任何想法为什么发生这种情况?Zend_controller_request_Asbtract 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; 
    } 

} 

我提供整个代码表明,下面的代码是在Zend控制器插件应用在了preDispatch如果任何区别。

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

回答

3

网址并没有改变,因为它的ZF MVC的内部重定向。但它是一件好事,因为如果你做了什么以上的大卫回答,那么如果用户甚至不允许管理模块的登录控制器的索引动作,那么他将卡在无限循环的重定向。

内部重定向的另一个优点是,当用户登录成功,才能将他重定向到他其实是想通过

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

当然简单地去的URL,这是一个方便用户把他送到他他在登录后预定的目的地。但是我会在会话中保存该目的地;重定向到登录;并在成功登录后将他重定向到他想要的目的地。这样,显示的地址栏中显示的网址实际上反映了他当时正在执行的功能。回复:无限重定向循环:当然,永远是危险的。但通常会从登录页面中删除/排除ACL限制。毕竟,这就是登录页面的用途。 –

1

如果你想在浏览器的地址栏更改URL,你需要(即发送这些报头到浏览器)重定向,不转发(即只需修改服务器端的$request对象) 。

因此,而不是:

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

尝试:

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