Я следил за учебником и всем руководством по авторизации 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);
}
}
У вас есть еще несколько недостатков кодирования в вашем коде. Один из них: вы забыли «вернуть» свои переадресации и что любой следующий код вообще не выполняется. И вам действительно нужно получить свои основы прямо, как упоминалось ndm. – mark
Я извиняюсь за формат, я никогда не писал на стек раньше, и сделал бедный и бросился работать над копированием кода. Интервал, чтобы сделать кодовые блоки, перепутал меня, и я не понимал, что он так плохо отображается. Не будучи вызванным, я имею в виду: когда вызывается функция addController add, я был под впечатлением, что isAuthorized() будет автоматически вызван из-за вызова authroize '=>' Controller 'в диспетчере приложений. Я ожидал, что мое тестовое сообщение появится, потому что я понял, что isAuthorized будет вызван, но ничего не появится, если я явно не назвал isAuthroized ($ user) в beforefilter – vars91