2010-06-04 29 views
16

Me gustaría saber cómo tratar 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.Cakephp Auth con múltiples tablas de "Usuarios"

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

Cheers,
Nicolas.

EDITAR: aquí está 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 
    } 
} 
+0

por qué no creó una tabla única para los usuarios. Podría haber definido fácilmente una columna separada en la tabla para 'tipo' de usuario. De esta manera no necesitará tener 4 modelos y controladores diferentes para r esos usuarios? –

+2

@Gaurav: Hola.No lo hice antes que nada porque hice el análisis ANTES de elegir el marco, y en segundo lugar porque existen relaciones entre artistas y teamartistas, por lo que en una vista de análisis necesita definir 2 tablas. La pregunta aquí no es acerca de cambiar el esquema (ya lo he pensado, con columnas nulas), sino de intentar encontrar una solución PHP para mi esquema. Aclamaciones. – Nicolas

+0

Estoy tratando de lograr una funcionalidad muy similar, donde cada tipo de usuario tiene un tablero diferente. Me preguntaba dónde pusiste ese código para extender el componente Auth. Y también, ¿cómo lograste la redirección? Establecer la variable de redirección en cada controlador? Gracias – AlexBrand

Respuesta

20

de AuthComponent CakePHP sólo se admite la autenticación con un único modelo "Usuario" a la vez. El modelo se elige configurando Auth::userModel property, 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 saber de antemano cuál es el modelo para cambiar a (por ejemplo, sus usuarios tienen que 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 pueda extender el núcleo AuthComponent añadir la funcionalidad que desee sobrescribir el AuthComponent::identify() method por lo que los bucles de una y la autenticación de los intentos 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 
    } 
} 

que tendrá que reemplazar occurrenc es de Auth en su aplicación con AppAuth para usar su AuthComponent extendido, a menos que use this trick.

+0

Gracias por su respuesta detallada. Volveré con usted y validaré su respuesta tan pronto como esté funcionando (si no, publicaré comentarios, pero parece prometedor). Aclamaciones. – Nicolas

+0

Así que elijo la segunda solución, y funciona perfectamente con su código y una línea que tuve que agregar: '$ this-> params [" data "] [$ model] = $ this-> params [" data "] [ "Usuario"]; '. ¡Gracias! – Nicolas

+0

Bueno. Me alegro de poder ayudar. – deizel

2

Aunque es molesto, creo que la mejor solución es probablemente usar el soporte 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 manera que está hablando, debe hacer un seguimiento de los permisos en el código del controlador, verificando qué es el modelo de 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 la reestructuración de su modelo de datos para tener una sola usuarios mesa y grupos tabla en lugar de las clases de entidad para cada tipo de usuario.

que acaba de pasar por el proceso de hacer esto por mí mismo ... :(

0

esto es también una posibilidad

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

Esto no permite un segundo modelo de usuario de autenticación, simplemente lo cambia de la tabla predeterminada de "Usuarios" esperada. – Zetaphor

0

Aquí está la solución final como sugiere deizel y modificado 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 
    } 
} 
Cuestiones relacionadas