Zend_controller_request_Asbtract URL未更改

时间:2012-05-12 20:50:06

标签: zend-framework url request zend-controller

我正在使用下面的代码将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');

2 个答案:

答案 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');