我正在使用下面的代码将ACL不允许的角色重定向到特定页面,问题是它通过将用户路由到所需的页面但没有更改URL而正常工作。因此,假设用户尝试在不登录的情况下进入管理索引页面(localhost / Admin),ACL插件将用户路由到登录页面但不更改URL(localhost / Admin / Login)。任何想法为什么会这样?
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中的zend控制器插件中使用,如果这有任何区别的话。
$request->setModuleName('Admin')
->setControllerName('Login')
->setActionName('index');
答案 0 :(得分:3)
Url没有改变,因为它是ZF MVC的内部重定向。但这是一件好事,因为 如果你做了大卫已经回答的话,那么如果用户甚至不允许管理模块的登录控制器的索引操作,那么他将陷入无限循环的重定向。
内部重定向的另一个优点是,当用户成功登录时,您可以将其重定向到他实际上想要去的网址
$this->redirect($_SERVER['REQUEST_URI');
答案 1 :(得分:1)
如果您希望更改浏览器位置栏中的网址,则需要重定向(即将这些标头发送到浏览器),而不是转发(即,只需修改服务器端的$request
对象)
所以,而不是:
$request->setModuleName('Admin')
->setControllerName('Login')
->setActionName('index');
尝试:
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$redirector->gotoSimpleAndExit('index', 'Login', 'Admin');