Cakephp Auth con più tabelle “Utenti”

Mi piacerebbe 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.

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ò ansible.

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

AuthComponent di CakePHP supporta solo l’autenticazione su un singolo modello “Utente” alla volta. Il modello viene scelto impostando la proprietà Auth::userModel , ma accetta solo una stringa e non una matrice di modelli.

È ansible cambiare al userModel il userModel con il seguente codice, ma ciò richiede di sapere in anticipo a quale modello passare (ad esempio, gli utenti devono scegliere il tipo di account da un menu a discesa):

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

Probabilmente è ansible estendere il nucleo AuthComponent per aggiungere la funzionalità desiderata sovrascrivendo il AuthComponent::identify() modo da AuthComponent::identify() il loop e tentare l’autenticazione con ciascun 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 } } 

Dovrai sostituire le occorrenze di Auth nella tua applicazione con AppAuth per utilizzare il tuo AuthComponent esteso, a meno che non usi questo trucco .

Nonostante sia fastidioso, penso che la soluzione migliore sia probabilmente l’utilizzo del supporto ACL integrato da Cake (vedi 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 ristrutturare il tuo modello di dati per avere una tabella di utenti e tabelle di singoli utenti invece di classi di entity framework per ogni tipo di utente.

Ho appena passato il processo per farlo da solo … 🙁

anche questa è una possibilità

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

Ecco la soluzione finale come suggerito da deizel e modificato da 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 } }