Asignación de modelo de complemento no funciona en cakephp 2.3 con torta ACL

Solo estoy tratando de implementar la autenticación de usuario ACL de Cakephp en un complemento llamado “Cauth”. Lo mismo que implemento antes estaba funcionando bien. Esta vez la diferencia es que está bajo el plugin. Aquí, en el controlador, $ this-> User-> Group-> find (‘list’); no está trabajando. Recibí el siguiente error fatal:

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 

Mi código es el siguiente:

Modelo de grupo:

 var $useTable = 'groups'; public $hasMany = array ( 'User' => array ( 'className' => 'Cauth.User', 'foreignKey' => 'group_id', 'dependent' => false, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'exclusive' => '', 'finderQuery' => '', 'counterQuery' => '' ) ); 

Modelo de usuario:

 var $useTable = 'users'; public $belongsTo = array ( 'Group' => array ( 'className' => 'Cauth.Group', 'foreignKey' => 'group_id', 'conditions' => '', 'fields' => '', 'order' => '' ) ); 

El controlador del usuario agrega acción, el cuadro de selección de grupo no funciona.

Acción de agregar controlador de usuarios:

 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')); } 

¿Alguien me puede ayudar a disparar este problema?

Nota especial: está trabajando en el siguiente caso.

Caso 1:

Si ato el modelo desde el controlador que funciona bien.

 $this->User->bindModel( array ('belongsTo' => array ('Group')) ); 

es decir

 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')); } 

Caso 2

Si permito el nombre de la acción para todos. El administrador tiene todos los permisos, aunque también tengo que escribir el archivo beforeFilter para el administrador.

 public function beforeFilter() { parent::beforeFilter(); $this->Auth->allow('index', 'add'); } 

He encontrado un caso más para hacerlo viable.

Caso 3:

El código para mi AppController fue:

 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'); } } 

En este caso, no estaba funcionando. Pero cuando lo hice –

 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'); } } 

Luego la asociación nuevamente comienza a funcionar. Todavía no puedo entender cuál es el problema con esta statement de componente.

 public $components = array ( 'DebugKit.Toolbar', 'RequestHandler', 'Acl', 'Auth' => array ( 'authorize' => array ( 'Actions' => array ('actionPath' => 'controllers') ) ), 'Session' ); 

Y si no declaro de esta manera, mi ACL no está funcionando. es decir, todos los grupos obtienen el mismo permiso.

Por favor, ayúdame. Estoy astackdo en esto durante mucho tiempo.

Finalmente, he encontrado la solución después de una larga lucha desde el siguiente enlace:

https://cakephp.lighthouseapp.com/projects/42648/tickets/2464-plugin-using-acl-not-loading-proper-model

Cuando usé el componente Auth, el controlador de usuario no estaba usando el modelo Cauth.user. Fue cargado usando AppModel. Pero sin el componente de autenticación, funcionaba correctamente. Para que la forma correcta de usar el componente de autenticación sea

  'Auth' => array ( 'authorize' => array ( 'Actions' => array ( 'actionPath' => 'controllers', 'userModel' => 'Cauth.User', ), ) ), 

Ese es el AppController total será –

 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'); } } 

Y ahora todo está funcionando bien. Gracias a todos.

Suponiendo que el Grupo es un nombre de un modelo (tabla), cambie esta línea de:

  $groups = $this->User->Group->find('list'); 

a

  $groups = $this->Group->find('list'); 

espero que ayude!

Prueba dos cosas para arreglar esto. Primero agregue lo siguiente a sus controladores de complemento de Usuarios y Grupos.

 public $uses = array('Users.User', 'Users.Group'); 

Segundo, defina los componentes dentro de sus controladores de complementos. En el tutorial Cake Auth de ACL ponen esto en el AppController principal, es necesario moverlo al plugin.

Puede hacer lo siguiente en su UsersAppController o UsersController

 public $components = array( 'Acl', 'Auth', 'Session' ); 

Espero que eso funcione, lo hizo por mí.