tutorial cake auth cakephp authentication user cakephp-1.3 multiple-tables

auth - document cakephp



Cakephp Auth con múltiples tablas de "Usuarios" (4)

Aunque es molesto, creo que la mejor solución es probablemente usar el soporte de ACL incorporado de Cake (ver http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl- controlled-application.html ).

Si realiza la autenticación de la forma en que está hablando, debe hacer un seguimiento de los permisos en el código del controlador, verificando qué es el modelo del usuario. Si utiliza una lista de control de acceso, el árbol de permisos ya existirá en la base de datos, lo que debería simplificar mucho su código y hacerlo más modular.

También significa reestructurar su modelo de datos para tener una tabla de usuarios únicos y una tabla de grupos en lugar de clases de entidades para cada tipo de usuario.

Acabo de pasar por el proceso de hacer esto yo mismo ... :(

Me gustaría saber cómo lidiar con UN solo proceso de autenticación y "usuarios" en múltiples tablas. Tengo una tabla de 4 usuarios: usuarios, administradores, artistas, teamadmins que tienen campos específicos, pero me gustaría que todos estos usuarios puedan conectarse a través de un solo formulario en la página principal, y luego ser redirigidos a sus paneles específicos.

Creo que las redirecciones no deberían ser un problema, y ​​algunas rutas añadidas deberían funcionar, pero realmente no sé dónde buscar / comenzar a hacer esto posible.

Aclamaciones,
Nicolas.

EDITAR : esta es la solución final (gracias a deizel)

App::import(''Component'', ''Auth''); class SiteAuthComponent extends AuthComponent { function identify($user = null, $conditions = null) { $models = array(''User'', ''Admin'', ''Artist''); foreach ($models as $model) { $this->userModel = $model; // switch model $this->params["data"][$model] = $this->params["data"]["User"]; // switch model in params/data too $result = parent::identify($this->params["data"][$model], $conditions); // let cake do its thing if ($result) { return $result; // login success } } return null; // login failure } }


esta es también una posibilidad

public function beforeFilter() { parent::beforeFilter(); $this->Auth->authenticate = array( AuthComponent::ALL => array(''userModel'' => ''AnotherModel''), ''Form'', ''Basic'' ); }


AuthComponent de CakePHP solo es compatible con la autenticación contra un solo modelo de "Usuario" a la vez. El modelo se elige configurando la propiedad Auth::userModel , pero solo acepta una cadena y no una matriz de modelos.

Puede cambiar el userModel sobre la marcha con el siguiente código, pero esto requiere que sepa de antemano a qué modelo cambiar (por ejemplo, los usuarios deben elegir su tipo de cuenta de un menú desplegable):

public function beforeFilter() { if (isset($this->data[''User''][''model''])) { $this->Auth->userModel = $this->data[''User''][''model'']; } }

Es probable que extienda el AuthComponent principal para agregar la funcionalidad que desea sobrescribiendo el AuthComponent::identify() para que se AuthComponent::identify() e intente la autenticación con cada modelo:

App::import(''Component'', ''AuthComponent''); class AppAuthComponent extends AuthComponent { function identify($user = null, $conditions = null) { $models = array(''User'', ''Admin'', ''Artist'', ''TeamAdmin''); foreach ($models as $model) { $this->userModel = $model; // switch model $result = parent::identify($user, $conditions); // let cake do it''s thing if ($result) { return $result; // login success } } return null; // login failure } }

Tendrá que reemplazar las apariciones de Auth en su aplicación con AppAuth para usar su AuthComponent extendido, a menos que use este truco .


Aquí está la solución final sugerida por deizel y modificada por Nicolas:

App::import(''Component'', ''Auth''); class SiteAuthComponent extends AuthComponent { function identify($user = null, $conditions = null) { $models = array(''User'', ''Admin'', ''Artist''); foreach ($models as $model) { $this->userModel = $model; // switch model $this->params["data"][$model] = $this->params["data"]["User"]; // switch model in params/data too $result = parent::identify($this->params["data"][$model], $conditions); // let cake do its thing if ($result) { return $result; // login success } } return null; // login failure } }