2012-05-12 34 views
0

ACLを許可しないロールを特定のページにリダイレクトさせるには、URLを変更せずに必要なページにユーザーをルーティングして問題なく動作している。したがって、ユーザがログインせずに管理インデックスページ(localhost/Admin)に移動しようとしていると仮定すると、ACLプラグインはユーザをログインページに誘導しますが、URL(localhost/Admin/Login)は変更しません。なぜこのようなことが起こっているのでしょうか?Zend_controller_request_ 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; 
    } 

} 

私は、これは、任意の違いを行う場合は、以下のコードはをpreDispatchでのZendコントローラプラグインで使用されていることを示すために全体のコードを提供します。前方

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

答えて

3

URLはそのためZF MVCの内部リダイレクトを変更されていません。しかし、その良いことは あなたはあなたが管理モジュールのログインコントローラのインデックスアクションにさえ許可されていない場合、彼はリダイレクションの無限ループで立ち往生する場合上記の答えを持っていることをダビッドするので。

ユーザのログインが正常にあなたは、彼が実際に確か

$this->redirect($_SERVER['REQUEST_URI'); 
+0

するだけで行きたかったURLに彼をリダイレクトすることができたときに内部リダイレクトのもう一つの利点は、彼に彼を送信するために、ユーザの利便です彼がログインした後の予定された目的地ですが、私はセッションでそれを保存します。ログインにリダイレクトする。ログインに成功すると、彼を目的の宛先にリダイレクトします。この方法では、彼のロケーションバーの表示されたURLは実際に彼がその時点で行っていた機能を反映しています。再:無限のリダイレクトループ:確かに、常に危険です。しかし、通常は、ログインページからACL制限を削除/除外します。結局のところ、それはログインページのためのものです。 –

1

あなたはブラウザのロケーションバーのURLを変更したい場合は、(ブラウザにこれらのヘッダを送信する、すなわち)リダイレクトする必要は、ない(つまり、単にサーバー側で$requestオブジェクトを変更) 。

ので、代わりに:

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

試してみてください。

$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
$redirector->gotoSimpleAndExit('index', 'Login', 'Admin'); 
関連する問題