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の内部リダイレクトであるため、変更されていません。しかし、davidが上記で回答したことを実行すると、ユーザーが管理モジュールのログインコントローラーのインデックスアクションを許可されていない場合、ユーザーはリダイレクトの無限ループでスタックするため、これは良いことです。

内部リダイレクトのもう1つの利点は、ユーザーが正常にログインしたときに、ユーザーが実際に行きたいURLにリダイレクトできることです。

$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 に答える