2014-12-01 3 views
0

Я следил за учебником и всем руководством по авторизации CakePHP, и я не могу получить метод isAuthorized() для вызова. Мое понимание (исправьте меня, если я ошибаюсь, что невероятно вероятно), делегируя полномочия определенным контроллерам, делая 'authorize'->['Controller'] в AppController.php, когда вызывается метод в UserController, в этом случае «add», UserController запускает метод isAuthorized() Я определил. Я тестировал, чтобы убедиться, что этот метод запущен при выводе сообщения об ошибке flash->, когда вызывается isAuthorized(), но ничего не происходит. Если я прямо вызываю isAuthorized($hardcodeduser) в моем методе beforeFilter(), он будет работать, но только если я буду жестко закодировать пользователя.cakephp 3.0 isAuthorized() не называется

Способ, которым должен работать метод: если зарегистрированный пользователь запрашивает добавление/создание нового пользователя, система проверяет, имеет ли пользователь права доступа администратора/персонала (что является только значением 0 или 1 в базе данных), и если у пользователя нет разрешения, он перенаправляется на главный экран с сообщением об ошибке «У вас нет доступа к этой функции».

Любая помощь или предложения или другие ссылки для последующего использования были бы высоко оценены!

class AppController extends Controller { 

    public $components = ['Flash', 'Auth', 'Session']; 

    public function initialize() { 

     $this->loadComponent('Flash'); 
     $this->loadComponent('Auth', [ 
      'authorize' => ['Controller'], 
      'loginRedirect' => [ 
       'controller' => 'Articles', 
       'action' => 'index' 
      ], 
      'logoutRedirect' => [ 
       'controller' => 'Pages', 
       'action' => 'display', 
       'home' 
      ] 

     ]); 
    } 

    public function beforeFilter(Event $event) { 
     $this->Auth->authorize = 'Controller'; 
    } 

    public function isAuthorized($user) { 

     if(isset($user['is_staff'])) 
      return true; 

     return false; 
    } 
} 


class UsersController extends AppController { 

    public function beforeFilter(Event $event) { 
     parent::beforeFilter($event); 
     $this->Auth->allow(['logout']); 
    } 

    public function isAuthorized($user) { 

     $this->Flash->error(__('Test Message PLEASE WORK')); 
     if($this->request->action === 'add') { 
      $isStaff = $user['is_staff']; 
      if($isStaff == 0) { 
       $this->redirect($this->Auth->redirectUrl()); 
       $this->Flash->error(__('Not authorized to access this function')); 
       return false; 
      } 
     } 
     return parent ::isAuthorized($user); 
    } 
} 
+0

У вас есть еще несколько недостатков кодирования в вашем коде. Один из них: вы забыли «вернуть» свои переадресации и что любой следующий код вообще не выполняется. И вам действительно нужно получить свои основы прямо, как упоминалось ndm. – mark

+0

Я извиняюсь за формат, я никогда не писал на стек раньше, и сделал бедный и бросился работать над копированием кода. Интервал, чтобы сделать кодовые блоки, перепутал меня, и я не понимал, что он так плохо отображается. Не будучи вызванным, я имею в виду: когда вызывается функция addController add, я был под впечатлением, что isAuthorized() будет автоматически вызван из-за вызова authroize '=>' Controller 'в диспетчере приложений. Я ожидал, что мое тестовое сообщение появится, потому что я понял, что isAuthorized будет вызван, но ничего не появится, если я явно не назвал isAuthroized ($ user) в beforefilter – vars91

ответ

7

Вообще ваше предположение верно, то Controller::isAuthorized() будет вызываться автоматически при использовании обработчика авторизации контроллера.

Проблема с кодом является то, что в вашем методе UsersController::beforeFilter() вы явно позволяет метод add быть доступен на всех (это даже не требует аутентификации):

$this->Auth->allow(['logout', 'add']); 

Вы должны понимать, что когда-то метод допускается, дальнейшие проверки, выполняемые компонентом auth, не будут выполнены, см. AuthComponent::startup().

отметить также, что вам не нужно перенаправлять и установить флэш-сообщение вручную, компонент будет делать это за вас, вам просто нужно настроить его соответствующим образом, используя authError и unauthorizedRedirect варианты см Cookbook > Components > Authentication > Configuration options

+0

Спасибо за ссылку на AuthComponent :: startup(), сделали много вещей яснее. Я еще не изменил параметры конфигурации Auth (нашел их при поиске решения моей проблемы), но пока у меня просто есть флеш-сообщение, чтобы убедиться, что isAuthorized вызывается. Я изменил Auth-> allow и вынул добавить, но проблема все еще остается. Я не знаю, что именно я потерял, или если я переопределяю метод isAuthorized() каким-то образом, или, возможно, мой beforeFilter() в любом контроллере должен быть изменен. – vars91

+0

Ничего, у меня все получилось. Спасибо – vars91

+0

Большое вам спасибо за этот ответ! Я почти вытаскивал свои волосы, потому что это не было вызвано, и оказалось, что я просто не понимаю, как это работает. – Gus

7

Поскольку мы следим за учебником блога Cake, , они совершили небольшую ошибку, эта функция «isAuthorized» никогда не будет вызвана. И я потратил время, чтобы исследовать его. Solution является Добавлением этой линии, когда компонент нагрузки "Auth":

'authorize' => array('Controller'), 

так что код должен выглядеть примерно так:

$this->loadComponent('Auth', [ 
    'loginRedirect' => [ 
     'controller' => 'Articles', 
     'action' => 'index' 
    ], 
    'logoutRedirect' => [ 
     'controller' => 'Pages', 
     'action' => 'display', 
     'home' 
    ], 
    'authorize' => array('Controller'),     
]); 

Надеется, что это помогает немного экономить один раз :)

+1

Они отметили это в учебниках [немного ниже] (http://book.cakephp.org/3.0/en/tutorials-and-examples/bookmarks/part-two.html#restricting-bookmark-access) , но я тоже это пропустил, и это помогло –

1

Из документации cakephp 3.x: вы можете настроить обработчики авторизации в методах beforeFilter() или initialize() вашего контроллера с помощью массива:

// Basic setup 
$this->Auth->config('authorize', ['Controller']); 

// Pass settings in 
$this->Auth->config('authorize', [ 
'Actions' => ['actionPath' => 'controllers/'], 
'Controller' 
]); 

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

  • Нет связанных вопросов^_^