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
}
}