0

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

2 回答 2

3

Url 没有改变,因为它是 ZF MVC 的内部重定向。但这是一件好事,因为如果您按照上面大卫的回答进行操作,那么如果甚至不允许用户执行管理模块登录控制器的索引操作,那么他将陷入重定向的无限循环。

内部重定向的另一个优点是,当用户成功登录时,您可以将他重定向到他实际想要访问的网址,只需通过

$this->redirect($_SERVER['REQUEST_URI');
于 2012-05-13T04:38:37.777 回答
1

如果您希望浏览器位置栏中的 url 改变,您需要重定向(即,将这些标头发送到浏览器),而不是转发(即,只需修改$request服务器端的对象)。

所以,而不是:

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

尝试:

$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$redirector->gotoSimpleAndExit('index', 'Login', 'Admin');
于 2012-05-12T23:30:15.343 回答