2014-07-07 9 views
6

W projekcie Symfony 2.4 nasz klient chce zmusić użytkowników do zmiany hasła co N dni. Widzieliśmy, że istnieją kolumny "credentials_expired" i "credentials_expire_at" w bazie danych i czek, który wyrzuca wyjątek AccountExpiredException w klasie UserChecker, który wydaje się być w tym celu, ale nie mogę znaleźć żadnej dokumentacji na temat włączania lub konfigurowania tego cecha.Jak używać poświadczeń wygasłej właściwości w Symfony AdvancedUserInterface?

  • W jaki sposób kolumna credentials_expire_at może być wypełniona datą N dni po teraz przy każdej zmianie hasła?
  • W jaki sposób użytkownik może zmienić hasło, jeśli hasło wygasło?
  • Jak ostrzec użytkownika przed wygaśnięciem ważności hasła na kilka dni wcześniej?
  • Czy można zabronić ponownego użycia ostatniego hasła?
+0

To pytanie jest zdecydowanie zbyt szeroki, ponieważ zawiera 4 pod-pytania. Czy możesz podzielić je na pojedyncze pytania? – nifr

+0

Możesz czerpać wiele inspiracji z [FOSUserBundle] (https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.md). Rozwiązali kilka z tych problemów. –

+0

powtórzył pytanie w trackerze problemów z symfony: https://github.com/symfony/symfony/issues/12177 –

Odpowiedz

1

W rzeczywistości jest to CredentialsExpiredException, który chcesz złapać. Jeśli używasz Symfony Security component, to najprostszym sposobem obsługi to jest do sprawdzenia wyjątku w loginAction swojej 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')); 
} 

Będziesz oczywiście trzeba utworzyć trasę do zmiany haseł, które Cię można ustawić jako działanie formularza szablonu changePassword. Żądania zmiany hasła można następnie odpowiednio przetwarzać w pliku SecurityController.

Rdzeń logiki biznesowej może/powinien istnieć w klasie usługi UserManager (którą można nazwać), którą można utworzyć i wywołać w razie potrzeby z poziomu SecurityController.

Nadzieję, że pomaga.

UWAGA: Dla potomności The upłynął obiekt użytkownika jest przechowywany wewnątrz wyjątkiem CredentialsExpiredException, dzięki czemu można łatwo odzyskać jeśli trzeba działać na nim za obsługę wygasłe hasła:

$error->getUser();