2012-06-21 15 views
5

Tengo un sitio web Cake y necesita tener dos inicios de sesión separados, cada uno tendrá su propio formulario de inicio de sesión y verá páginas diferentes, sería bueno tener dos tablas diferentes porque no hay similitudes entre los dos tipos de personasCakePHP 2 tablas de inicio de sesión separadas

Cada formulario de inicio de sesión será utilizado solo por ciertas personas y nunca podrán iniciar sesión en la otra forma, y ​​viceversa.

Además, las dos tablas de inicio de sesión tienen una relación entre ellas, lo que requiere 2 tablas?

¿Esto es posible?

+1

Eso se parece a lo que necesito, pero para una versión anterior de la torta, tal vez @deizel verá esto :) – 472084

+0

El mismo tipo de concepto, excepto que el 'identificador 'se movió a los objetos de autenticación y se llama' authenticate' (o específicamente el método '_findUser' en' BaseAuthenticate'). – jeremyharris

+0

Así que simplemente cambie 'identify' a' authenticate'? http://codepad.viper-7.com/1BX9fE – 472084

Respuesta

10

Primero, agregue un par de objetos de autenticación personalizados vacíos. Reutilizaremos la misma lógica que usa FormAuthenticate (es decir, usa datos POST para verificar la base de datos de un usuario), pero simplemente cambie el modelo dentro de la configuración del objeto (más adelante).

aplicación/controlador/Componente/auth/ModelOneAuthenticate.php

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class ModelOneAuthenticate extends FormAuthenticate { 
} 

aplicación/controlador/Componente/auth/ModelTwoAuthenticate.php

<?php 
App::uses('FormAuthenticate', 'Controller/Component/Auth'); 

class ModelTwoAuthenticate extends FormAuthenticate { 
} 

luego decirle a su aplicación para utilizar estos objetos para autenticarse, y decirle qué modelo usar. También puede personalizar los campos aquí. En su AppController:

public $components = array(
    'Auth' => array(
     'authenticate' => array(
      'ModelOne' => array(
       'userModel' => 'ModelOne', 
       'fields' => array(
        'username' => 'my_custom_username_field', 
        'password' => 'some_password_field' 
       ) 
      ), 
      'ModelTwo' => array(
       'userModel' => 'ModelTwo' 
      ) 
     ) 
    ) 
); 

El primer objeto de autenticación comprobaría la tabla model_ones un nombre de usuario y contraseña en my_custom_username_field en some_password_field, mientras que el segundo comprobaría model_twos utilizando los estándares username y password campos.

+0

¡Gracias por esto! He hecho todo el código y no hay errores hasta el momento, pero cuando voy a una página restringida, intenta dirigirse a los usuarios/iniciar sesión cuando he dicho que vaya a agentes/inicio de sesión - ay ideas ¿por qué? Esto es lo que tengo: http://codepad.org/zvBeJFEX – 472084

+0

Tendrá que establecer la propiedad loginRedirect: http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html# AuthComponent :: $ loginRedirect – jeremyharris

+0

Lo he configurado así: http://codepad.org/zvBeJFEX - ¿Debo agregarlo a las clases de autenticación recién creadas? – 472084

1

Cuando tienen que iniciar sesión hay una similitud: ambos requerirán que ingrese las credenciales, generalmente un nombre de usuario/correo electrónico y contraseña. Por lo tanto, una tabla de usuarios y una tabla foo_profiles y una tabla bar_profiles, según el tipo de usuario, también deberían funcionar.

Si realmente quiere ir con dos tablas diferentes y la pila MVC para ellas, simplemente use dos controladores diferentes FooUsers y BarUsers y dentro de cada uno cree un método de inicio de sesión personalizado.

+0

Cada uno de los 2 tipos de usuario solo tendrá que iniciar sesión en su única forma, nunca en la otra. cada formulario requiere una cuenta de usuario diferente. ¿Conoce algún recurso para ayudar con "crear un método de inicio de sesión personalizado". Gracias. – 472084

+0

Sí, consulte este tutorial en: http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html. En el método de inicio de sesión, simplemente haga lo que necesite. – burzum

+0

No veo ninguna ayuda para tener dos tablas de inicio de sesión, ¿solo movería el código que dice para poner en AppController en su controlador independiente? – 472084

1

He hecho esto previamente escribiendo componentes de autenticación personalizados que se extienden desde BaseAuthenticate. Siempre que implementen el método authenticate(), podrás hacer lo que quieras con cada uno de los diferentes tipos de usuario.

En su AppController necesita registrar los diferentes componentes haciendo algo como

public $components = array(
    "Session", 
    "Auth" => array(
     'authenticate'  => array("UserType1", "UserType2"), 
    ) 
); 

Mira la cookbook para el resto de la misma.

+0

¿Podría compartir parte del código que usó, por favor? (para el objeto de autenticación personalizado) – 472084

+0

Preferiría no TBH. Sin embargo, la esencia de esto es que si está contento con el usuario autenticado, devuelve una matriz que luego se almacena en $ auth-> usuario. Si no eres feliz, devuelves 'falso' y Cake se encarga de eso. El enlace que proporcioné lo lleva a la sección relevante del controlador de autenticación por usted. –

+0

Así que dentro del nuevo objeto de autenticación, solo tendría que decir '(si el login y la contraseña coinciden con la tabla 1) {return $ row1; } elseif (tabla de coincidencia de inicio de sesión y contraseña 2) {return $ row2; } else {return false; } '?? – 472084

2

La forma más sencilla de hacer esto es simplemente establecer una clave de sesión diferente para cada tipo de entrada:

if ($loginTypeOne) { 
    $this->Auth->authenticate = array(
    'Form'=> array(
     'userModel'=> 'TypeOne', 
    ) 
    ); 
    AuthComponent::$sessionKey = 'Auth.TypeOne'; 
} else { 
    $this->Auth->authenticate = array(
    'Form'=> array(
     'userModel'=> 'TypeTwo', 
    ) 
    ); 
    AuthComponent::$sessionKey = 'Auth.TypeTwo'; 
} 
0
You can have a look on this. 
Define Model for both login member and then define table which you want to use for the user. 
set variable in model. 


class SearchedCategory extends AppModel { 
    var $name = 'SearchedCategory'; 
    Var useTable = 'give your table name here.'; 
    var $primaryKey = 'id'; 


} 
Cuestiones relacionadas