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