2012-05-12 1 views
0

Я использую приведенный ниже код, чтобы переадресовать перенаправленные роли ACL на определенную страницу, проблема в том, что она работает нормально, перенаправляя пользователя на нужную страницу, но не меняя URL-адрес , Поэтому давайте предположим, что пользователь пытается перейти на страницу индекса администратора (localhost/Admin) без входа в систему, подключаемый модуль ACL будет маршрутизировать пользователя на страницу входа в систему, но без изменения URL-адреса (localhost/Admin/Login). Есть идеи, почему это происходит?Zend_controller_request_Asbtract 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, если это делает никакой разницы.

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

ответ

3

Url не меняется потому, что его внутренний редирект в ZF MVC. Но это хорошая вещь, потому что , если вы делаете то, что ответил david выше, тогда, если пользователю даже не разрешено действие индексатора контроллера входа в модуль администратора, он застрянет в бесконечном цикле перенаправления.

Еще одно преимущество внутреннего перенаправления, когда пользователь Войти успешно вы можете перенаправить его на URL, на которой он на самом деле хотел идти просто

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

Безусловно, это удобство для пользователя, чтобы отправить его в его назначенный пункт назначения после входа в систему. Но я бы сохранил это в сеансе; перенаправлять на логин; и, при успешном входе в систему, перенаправьте его в нужное место. Таким образом, отображаемые URL-адреса в его строке местоположения фактически отражают функциональность, которую он выполняет в то время. Re: Бесконечные перекрестные циклы: Конечно, всегда опасность. Но, как правило, один удаляет/исключает ограничения ACL на странице входа. В конце концов, это страница входа в систему. –

1

Если вы хотите URL в адресной строке браузера, чтобы изменить, вам нужно перенаправить (то есть, отправить эти заголовки в браузере), а не вперед (то есть, просто изменить $request объект на стороне сервера) ,

Таким образом, вместо того, чтобы:

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

попробовать:

$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
$redirector->gotoSimpleAndExit('index', 'Login', 'Admin');