2014-02-14 6 views
0

Я полностью и полностью потерял, как это сделать. У меня есть три разные роли: Admin, Staff и Donors. Моя проблема в том, что она действительно запутывает (для меня в любом случае) с разрешениями и, как и соответствующие перенаправления, если неавторизованный пользователь пытается получить доступ к действию из URL-адреса.cakePHP- Роль авторизации и маршрутизации

В моей UsersController у меня есть следующие действия

  1. admin_index
  2. admin_add
  3. admin_edit
  4. admin_view
  5. admin_delete

не-приставкой действия

  1. Войти
  2. выход из системы
  3. вид
  4. добавить
  5. редактировать

Администратор должен иметь возможность получить доступ ко всем админ-приставкой действия, а также входа в систему и выход из системы, в то время как персонал и донор должен иметь доступ только к последним 5. Также обратите внимание, что все пользователи используют одну и ту же форму для входа.

В компоненте моих AppControlles, я бы следующее:

'Auth' => array(
      'loginRedirect' => array( 
       'controller' => 'donors', 
       'action' => 'index' 
      ), 
      'logoutRedirect' => array( 
       'controller' => 'users', 
       'action' => 'login' 
      ), 
      'authorize' => array('Controller') 
) 

Однако, на мой логин действия проверяю для роли пользователя, чтобы изменить loginRedirect соответственно:

if($this->request->is('post')){ 
      if($this->Auth->login()){ 

      switch($this->Auth->user('role')){ 
       case 'admin': 
        $this->Auth->loginRedirect = array('controller'=>'users','action'=>'admin_index','prefix'=>'admin','admin'=>true); 
        break; 
       case 'donor': 
       ... 
       break; 
       case ..... 
      } 
     } 
} 

Вопрос 1 Теперь, если текущий пользователь с ролью донора вошел в систему и пытается получить доступ к localhost/sitename/admin/users/add, он перенаправляется на admin/donors, а не только /donors. Итак, как я могу удалить префикс администратора?

Вопрос 2 Также я не полностью понимаю hwo $ this-> Auth-> allow(), работает. Если в моем donorsController я хочу контролировать доступ к действиям контроллеров в соответствии с ролями, как я могу это сделать Это? Так, например, если в моем donorsController есть действие «удалить», как я смогу разрешить пользователю штата, а также лишить пользователя-донора доступа к действию удаления. Я считаю, что beforeFilter - это решение, но не может найти, как это сделать! Любые указатели? Thanks

+1

Вы всегда должны указать точную версию cakephp, которую используете. Совет. Вместо того, чтобы создавать избыточный код контроллера, здесь может возникнуть смысл использовать простую форму для входа в систему и [Tiny] (http://www.dereuromark.de/2011/12/18/tinyauth-the-fastest- и-easiest-authorization-for-cake2 /) в качестве подхода Auth. Таким образом, каждое действие четко определено, и в случае отсутствия доступа все действия будут перенаправлены на/login в качестве центральной формы входа. – mark

+0

Спасибо за ваш знак ответа! Я прошел через ваш блог и выглядел чистым. Однако у меня нет такой настройки, поскольку роли определяются в пользовательской таблице как поле, а не модель. Также у меня все еще есть проблемы с пониманием того, как работает $ this-> Auth-allow(), так как я надеялся, что смогу возобновить работу с настройкой, которую у меня есть. Благодаря! – LogixMaster

+1

Работает только поле таблицы пользователей. Прочтите документы для него. Не обязательно быть моделью. – mark

ответ

1

1) В вашем входе в систему() действие impelement проверку на роли пользователя, если роль администратора перенаправлять любой контроллер/действие и установить префикс администратора. Если ГС не администратор перенаправляет его на что-то другое.

if ($this->Auth->login()) { 
    if ($this->Auth->user('role') === 'admin') { 
     $this->redirect(array(
      'admin' => true, 
      'controller' => 'foo', 
      'action' => 'bar'))); 
    } else { 
     // Do something else, another redirect or whatever 
    } 
} 

Там нет необходимости удалять/администратор из URL, как это должно показать ГЭК Пользователь не авторизован, когда он пытается получить доступ к URL, он не имеет права.

2) Если вы хотите предоставить доступ для разных ролей, вы можете использовать SimpleRbacAuth, который я написал. Check the tests for examples о том, как это работает. Вы просто определяете структуру вложенных массивов и добавляете роли, которые хотите выполнить, или весь контроллер или предоставляете доступ всем, используя *.

+0

Я обязательно проверю ваш код rbac! Однако проверка роли в действии входа - это то, что я уже делаю (поэтому не очень полезно для этого вопроса, но может быть для посетителей)! – LogixMaster

1

Это может быть решение для вас.

Перейти к файлу core.php и раскомментировать, если присутствует/добавить, если нет текущей строки.

Configure::write('Routing.prefixes', array('admin')); 
Location: app/config/core.php 

Поместите код ниже внутри метода beforeFilter из AppController.php (торт версии 2.X)/app_controller.php (торт версии < 2.X)

function beforeFilter(){ 
    if($this->Auth->user('role') == 'admin'){ 
     if(!in_array($this->params['action'],array('login','logout')) && (stristr($this->params['action'], 'admin_') === FALSE)){ 
      $this->redirect(array("controller"=>$this->params['controller'],"action"=>'admin_'.$this->params['action'],"admin" => 1)); 
     } 
    }else{ 
     if(stristr($this->params['action'], 'admin_')){ 
     $action = explode('_',$this->params['action']); 
     $this->redirect(array("controller"=>$this->params['controller'],"action"=>$action[1],"admin" => false)); 
     } 
    } 
} 

Остальные функции, которыми вы можете управлять, обрабатывая страницу пользовательских ошибок.

Вы можете обратиться к Customize error pae

+0

Это излишне сложно. В запросе есть «префикс», нет необходимости разбирать действие для префикса, а действия входа и выхода могут быть определены установкой компонента Auth. – burzum

+0

Спасибо! это может быть не совсем то, что я хочу, поскольку он просто удаляет префикс администратора из URL-адреса, что я и задал в моем вопросе. Итак, отмечая это как ответ., Поскольку я на самом деле думаю, что могу работать с этим! Также +1 для hightlighting настроить страницу ошибки! – LogixMaster

+0

@burzum не могли бы вы подробно рассказать об этом, почему это сложно, или если есть лучший способ это сделать? Спасибо – LogixMaster

Смежные вопросы