Я просто пытаюсь реализовать аутентификацию пользователя Cakephp ACL в плагине с именем «Cauth». То же самое, что я реализую раньше, прекрасно работает. На этот раз разница в том, что она находится под плагином. Здесь, в контроллере, $ this-> User-> Group-> find ('list'); не работает. Я получил следующую фатальную ошибку:
Fatal Error Error: Call to a member function find() on a non-object File: my_dir_path\app\Plugin\Cauth\Controller\UsersController.php Line: 60 Notice: If you want to customize this error message, create app\View\Errors\fatal_error.ctp
Мой код:
Модель группы:
var $useTable = 'groups'; public $hasMany = array ( 'User' => array ( 'className' => 'Cauth.User', 'foreignKey' => 'group_id', 'dependent' => false, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'exclusive' => '', 'finderQuery' => '', 'counterQuery' => '' ) );
Модель пользователя:
var $useTable = 'users'; public $belongsTo = array ( 'Group' => array ( 'className' => 'Cauth.Group', 'foreignKey' => 'group_id', 'conditions' => '', 'fields' => '', 'order' => '' ) );
Контроллер пользователей добавляет действие, поле выбора группы не работает.
Контроллер пользователей добавляет действие:
App::uses('CauthAppController', 'Cauth.Controller'); class UsersController extends CauthAppController { public function add() { if ($this->request->is('post')) { $this->User->create(); if ($this->User->save($this->request->data)) { $this->Session->setFlash(__('The user has been saved')); $this->redirect(array ('action' => 'index')); } else { $this->Session->setFlash(__('The user could not be saved. Please, try again.')); } } $groups = $this->User->Group->find('list'); $this->set(compact('groups')); }
Может ли кто-нибудь помочь мне перестрелять эту проблему.
Особое примечание: он работает над следующим случаем.
Дело 1:
Если я привяжу модель к контроллеру, это будет отлично.
$this->User->bindModel( array ('belongsTo' => array ('Group')) );
т.е.
public function add() { $this->User->bindModel( array ('belongsTo' => array ('Group')) ); if ($this->request->is('post')) { $this->User->create(); if ($this->User->save($this->request->data)) { $this->Session->setFlash(__('The user has been saved')); $this->redirect(array ('action' => 'index')); } else { $this->Session->setFlash(__('The user could not be saved. Please, try again.')); } } $groups = $this->User->Group->find('list'); $this->set(compact('groups')); }
Случай 2:
Если я разрешаю имя действия для всех. Администратор имеет все разрешения, хотя мне также нужно написать beforeFilter для admin.
public function beforeFilter() { parent::beforeFilter(); $this->Auth->allow('index', 'add'); }
Я нашел еще один случай, чтобы сделать его работоспособным.
Случай 3:
Код моего AppController был –
class AppController extends Controller { public $helpers = array ('Form', 'Time', 'Html', 'Session', 'Js', 'DebugKit.Toolbar'); public $counter = 0; public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authorize' => array ( 'Actions' => array ('actionPath' => 'controllers') ) ), 'Session' ); public function beforeFilter() { //Configure AuthComponent $this->Auth->loginAction = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->logoutRedirect = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array ('plugin' => '', 'controller' => 'pages', 'action' => 'display'); } }
В этом случае он не работал. Но когда я это сделал –
class AppController extends Controller { public $helpers = array ('Form', 'Time', 'Html', 'Session', 'Js', 'DebugKit.Toolbar'); public $counter = 0; public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authenticate' => array('Form') ), 'Session' ); public function beforeFilter() { //Configure AuthComponent $this->Auth->loginAction = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->logoutRedirect = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array ('plugin' => '', 'controller' => 'pages', 'action' => 'display'); } }
Затем ассоциация снова начинает работать. Все еще не могу понять, в чем проблема с этим объявлением компонента.
public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authorize' => array ( 'Actions' => array ('actionPath' => 'controllers') ) ), 'Session' );
И если я так не заявляю, мой ACL не работает. т.е. все группы получают одинаковое разрешение.
Пожалуйста, помогите мне. Я стою на этом очень долгое время.
Наконец, я нашел решение после долгой борьбы со следующей ссылки –
Когда я использовал компонент Auth, пользовательский контроллер не использовал модель Cauth.user. Он был загружен с помощью AppModel. Но без компонента auth он работал правильно. Так что правильный способ использования компонента auth будет
'Auth' => array ( 'authorize' => array ( 'Actions' => array ( 'actionPath' => 'controllers', 'userModel' => 'Cauth.User', ), ) ),
Это общий AppController будет –
class AppController extends Controller { public $helpers = array ('Form', 'Time', 'Html', 'Session', 'Js', 'DebugKit.Toolbar'); public $counter = 0; public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authorize' => array ( 'Actions' => array ( 'actionPath' => 'controllers', 'userModel' => 'Cauth.User', ), ) ), 'Session' ); public function beforeFilter() { //Configure AuthComponent $this->Auth->loginAction = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->logoutRedirect = array ('plugin' => 'cauth', 'controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array ('plugin' => '', 'controller' => 'pages', 'action' => 'display'); } }
И теперь все работает нормально. Спасибо всем.
Предполагая, что группа является именем модели (таблицы), измените эту строку:
$groups = $this->User->Group->find('list');
в
$groups = $this->Group->find('list');
надеюсь, это поможет!
Попробуйте две вещи, чтобы исправить это. Сначала добавьте следующие контроллеры плагинов пользователей и групп.
public $uses = array('Users.User', 'Users.Group');
Во-вторых, определите компоненты в своих контроллерах плагинов. В учебном курсе ACL Auth они помещают это в основной AppController, вам нужно переместить его в плагин.
Вы можете либо сделать следующее в своем UserAppController или UserController
public $components = array( 'Acl', 'Auth', 'Session' );
Надеюсь, что это сработает.