2010-06-04 9 views
16

Vorrei sapere come gestire solo UN processo di autenticazione e "utenti" in più tabelle. Ho una tabella di 4 utenti: utenti, amministratori, artisti, teamadmin che hanno tutti campi specifici, ma vorrei che tutti questi utenti fossero in grado di connettersi tramite un solo modulo sulla home page, e di essere successivamente reindirizzati ai loro specifici cruscotti.Auth di Cakephp con più tabelle "Utenti"

Penso che i reindirizzamenti non dovrebbero essere un problema, e alcune rotte aggiunte dovrebbero funzionare, ma non so davvero dove cercare/iniziare a fare tutto ciò possibile.

Cheers,
Nicolas.

EDIT: ecco la soluzione finale (grazie 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

perché non hai creato un tavolo singolo per gli utenti.Potresti definire facilmente una colonna separata nella tabella per 'tipo' di utente.Questo modo non avrai bisogno di avere 4 diversi modelli e controller per quegli utenti? –

+2

@Gaurav: Ciao.Non l'ho fatto prima di tutto perché ho fatto l'analisi PRIMA di scegliere il framework, e in secondo luogo perché ci sono relazioni tra artisti e teamartisti, quindi in una vista analisi è necessario definire 2 tabelle. La domanda qui non riguarda la modifica dello schema (ho già pensato a questo, con colonne null) ma cercando di trovare una soluzione PHP per il mio schema. Saluti. – Nicolas

+0

Sto cercando di ottenere una funzionalità molto simile, in cui ogni tipo di utente ha una dashboard diversa. Mi stavo chiedendo dove hai messo quel codice per estendere il componente Auth? E inoltre, come hai raggiunto il reindirizzamento? Impostazione della variabile di reindirizzamento in ciascun controller? Grazie – AlexBrand

risposta

20

di AuthComponent CakePHP supporta solo l'autenticazione contro un singolo modello di "Utente" in un momento. Il modello viene scelto impostando Auth::userModel property, ma accetta solo una stringa e non una serie di modelli.

È possibile cambiare la userModel al volo con il seguente codice, ma questo richiede di sapere in anticipo quale modello per passare (ad esempio gli utenti devono scegliere il loro tipo di account da un menu a discesa.):

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

si può probabilmente estendere il nucleo AuthComponent per aggiungere la funzionalità desiderata sovrascrivendo la AuthComponent::identify() method quindi loop più e l'autenticazione tentativi con ogni modello:

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

si dovrà sostituire occurrenc es di Auth nell'applicazione con AppAuth per utilizzare l'AuthComponent esteso, a meno che non si utilizzi this trick.

+0

Grazie per la risposta dettagliata. Tornerò da te e convaliderò la tua risposta non appena funzionerà (altrimenti posterò commenti, ma sembra promettente). Saluti. – Nicolas

+0

Quindi scelgo la seconda soluzione e funziona perfettamente con il tuo codice e una riga che dovevo aggiungere: '$ this-> params [" data "] [$ model] = $ this-> params [" data "] [ "Utente"]; '. Grazie! – Nicolas

+0

Bello. Sono contento di poterti aiutare. – deizel

2

Sebbene fastidioso, penso che la soluzione migliore sia probabilmente l'utilizzo del supporto ACL integrato di Cake (vedere http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.html).

Se si esegue l'autenticazione nel modo in cui si sta parlando, è necessario tenere traccia delle autorizzazioni nel codice del controller, controllando di vedere cos'è UserModel. Se si utilizza un elenco di controllo di accesso, l'albero dei permessi sarà già presente nel database, il che dovrebbe semplificare notevolmente il codice e renderlo più modulare.

Significa anche la ristrutturazione il tuo modello di dati di avere un unico utenti tavolo e gruppi tavolo invece di classi di entità per ogni tipo di utente.

Ho appena passato attraverso il processo di fare questo io stesso ... :(

0

questo è anche una possibilità

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

Questo non consente un secondo modello utente auth, semplicemente lo modifica dalla tabella "Utenti" predefinita. – Zetaphor

0

Ecco la soluzione finale, come suggerito da deizel e modificato da Nicolas: