Refactoring di un'implementazione Zend_Auth

Sto lavorando a un progetto esistente con due aree che possono essere registrate. Una sezione di amministrazione e il front-end.

Attualmente la sezione admin ha un'azione di login e il front end ha una propria azione di login. L'amministratore accede utilizzando una tabella di database specifica per gli account di amministrazione, il front-end è connesso utilizzando una tabella diversa tutti insieme.

Se l'amministratore ha effettuato l'accesso e tenta di accedere al front-end, viene richiesto di accedere come utente front-end (necessario perché gli utenti front-end ottengano contenuti completamente diversi in base ai progetti a cui sono associati e l'amministratore non è associato a uno progetto particolare).

Una volta effettuato l'accesso come utente front-end, le loro credenziali di amministratore sono sparite e devono effettuare nuovamente l'accesso se tentano di rientrare nella sezione di amministrazione.

Voglio fare in modo che l'amministratore possa essere registrato nella sezione admin E accedere come utente front-end specifico. Quindi essere in grado di passare avanti e indietro tra le due sezioni del sito senza wherer effettuare nuovamente l'accesso.

Qual è il modo migliore per gestirlo all'interno di Zend Framework?

Finora sto pensando di perdere le azioni di login separate e di averne una sola (non ce n'è bisogno per due, giusto?) E poi devo occuparmi di consentire credenziali separate.

Attualmente, l'accesso come utente front-end comport che l'utente amministratore debba accedere di nuovo per accedere all'area di amministrazione. È perché alcune credenziali $ _SESSION vengono sovrascritte? Devo in qualche modo creare una variabile $ _SESSION personalizzata per gestire questo modo ZF?

Ovviamente non posso assegnare direttamente un valore a $ _SESSION ['front_end'] o $ _SESSION ['admin'] (cosa che avrei fatto in passato) quindi come dovrei farlo all'interno di Zend Framework?

Grazie!

Prima domanda, hai davvero bisogno di fare questo? Supponendo che gli utenti amministratori possano accedere a tutti i progetti, l'approccio tipico a qualcosa di simile sarebbe quello di dare agli amministratori un menu a discesa sul frontend che elenca tutti i progetti e consente loro di passare da uno all'altro. Una volta selezionata, questa selezione viene archiviata nella loro session e possono visualizzare i dati come se fossero stati registrati come uno di quegli utenti. Possono quindi passare da un progetto all'altro a piacimento.

Se hai davvero bisogno di due accessi, questo dovrebbe essere certamente ansible. Per impostazione predefinita, Zend_Auth utilizza la class Zend_Auth_Storage_Session per archiviare il risultato dell'authentication nella session. Questa class utilizza lo spazio dei nomi di session 'Zend_Auth' per impostazione predefinita (ovvero i dati vengono archiviati in $_SESSION['Zend_Auth'] ), quindi quando l'utente frontend accede con successo $_SESSION['Zend_Auth'] i loro dati di authentication di session vengono sovrascritti dal risultato del admin auth. Quindi quello che vuoi fare è get Zend_Auth_Storage_Session per usare uno spazio dei nomi diverso per gli accessi all'amministratore (o uno spazio dei nomi personalizzato per ciascuno).

In teoria dovresti essere in grado di fare qualcosa del genere:

 public function loginAction() { $auth = Zend_Auth::getInstance(); if (...) { // check some condition that returns true for admin logins // setup storage with custom admin namespace (can be any string) $authStorage = new Zend_Auth_Storage_Session('Yourapp_Admin_Auth'); } else { // use defaults $authStorage = new Zend_Auth_Storage_Session(); } $auth->setStorage($authStorage); // carry on login as normal [...] } 

quindi, ciò che sta facendo è far sì che Zend_Auth utilizzi $_SESSION['Yourapp_Admin_Auth'] per gli accessi amministrativi e $_SESSION['Zend_Auth'] predefinito per i frontend.