2014-07-07 10 views
6

In un progetto Symfony 2.4 il nostro cliente desidera forzare gli utenti a cambiare la propria password ogni N giorni. Abbiamo visto che ci sono colonne "credentials_expired" e "credentials_expire_at" nel database e un controllo che genera un contoExpiredException nella classe UserChecker che sembra essere per quello scopo, ma non riesco a trovare alcuna documentazione su come abilitare o configurare questo caratteristica.Come utilizzare la proprietà di credenziali scadute in Symfony AdvancedUserInterface?

  • In che modo la colonna credentials_expire_at può essere riempita con una data N giorni dopo la modifica di ogni password?
  • Come può un utente modificare la password, se la password è scaduta?
  • Come avvisare l'utente della scadenza del passoword alcuni giorni prima?
  • È possibile vietare il riutilizzo dell'ultima password?
+0

questa domanda è sicuramente troppo ampio in quanto contiene 4 sotto-domande. Potresti dividerli in singole domande per favore? – nifr

+0

Puoi trarre molta ispirazione da [FOSUserBundle] (https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.md). Hanno risolto un paio di questi problemi. –

+0

ha ripetuto la domanda nel tracker dei problemi di symfony: https://github.com/symfony/symfony/issues/12177 –

risposta

1

In realtà, è lo CredentialsExpiredException che si desidera catturare. Se si utilizza il Symfony Security component, quindi il modo più semplice per gestire questa situazione è quello di verificare per l'eccezione nella loginAction del vostro SecurityController:

use Symfony\Component\Security\Core\Exception\CredentialsExpiredException; 
use Symfony\Component\Security\Core\SecurityContextInterface; 

... 

$error = $this->get('session')->get(SecurityContextInterface::AUTHENTICATION_ERROR); 

// check if credentials have expired 
if ($error instanceof CredentialsExpiredException) { 
    // display the change password form 
    return new Response($this->renderView('AcmeDemoBundle:Security:changePassword.html.twig')); 
} 

avrete ovviamente bisogno di creare un percorso per la modifica delle password, che si può impostare l'azione modulo del modello changePassword. Le richieste di cambio password possono quindi essere gestite di conseguenza nel tuo SecurityController.

Il core della logica aziendale può/deve esistere all'interno di una classe di servizio UserManager (o qualsiasi altra cosa si voglia chiamare), che è possibile creare un'istanza e richiamarla secondo necessità dal proprio SecurityController.

Spero che questo aiuti.

NOTA: Ai posteri, l'oggetto utente scaduto viene memorizzato all'interno eccezione CredentialsExpiredException, in modo da poter facilmente recuperare se avete bisogno di agire su di esso per la gestione delle password validi:

$error->getUser();

Problemi correlati