Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony] CredentialsExpiredException a zmiana hasła.
Forum PHP.pl > Forum > PHP > Frameworki
netmare
Ma ktoś pomysł jak można umożliwić użytkownikowi zmianę hasła po wystąpieniu tego wyjątku przy logowaniu?
ano
Stwórz ExceptionListener sprawdzający typ wyjątku - jeśli będzie to Credentials... to możesz wtedy zrobić cokolwiek chcesz - np przekierować usera na stronę zmiany hasła.
netmare
Kurcze nie mam teraz jak sprawdzić. Przekierować oczywiście dam radę. Problem którego się obawiam to, że mimo obsłużenia wyjątku Token nie zostanie utworzony, a więc nie będę mógł przekieować użytkownika na route za firewallem. A strona powinna być za firewallem i token też by się przydał. Ale potestuję to może w poniedziałek. Tak czy owak dzięki za wskazówkę.
ano
To fakt - tokena nie będzie bo w praktyce uwierzytelnianie się nie udało.
Strona do zmiany hasła może być za firewallem, ale nie takim, który by wymagał bycia zalogowanym.
Z tego co pamietam to ten wyjątek przechowuje username osoby próbującej się zalogować - wystarczy je użyć do redirecta zmiany hasła. (Np zapamietac w sesji username, lub zapisac w db przy tym userze token do zmiany hasła i stronę zmiany hasła wywołać z tym tokenem) - od Ciebie zależy inwencja ;-)
netmare
Raz jeszcze dzięki, potestuję po weekendzie.

Muszę odgrzać temat bo nie udało mi się rozwiązać problemu.

Otóż utworzyłem handler implementujący AuthenticationFailureHandlerInterface. Niestety w AuthenticationProviderManager z jakiegoś powodu jest tak:

  1. try {
  2. $result = $provider->authenticate($token);
  3.  
  4. if (null !== $result) {
  5. break;
  6. }
  7. } catch (AccountStatusException $e) {
  8. $e->setExtraInformation($token);
  9.  
  10. throw $e;
  11. } catch (AuthenticationException $e) {
  12. $lastException = $e;
  13. }


i zamiast otrzymać obiekt usera otrzymuję to co było wpisane w formularz logowania. Dodam że zmieniłem CredentialsExpired na AccountExpired gdyż sprawdzane jest dopiero po logowaniu.

Sprawdzenie danych z formularza, ciężko wykonać samemu ze względu na chain provider, który mam użyty.

I teraz moje pytanie czy powinienem załatwić to rejestrując jakiś swój provider manager i jak wewntualnie to zrobić czy jakieś inne rozwiązanie?
netmare
Mimo, że mi się to nie podoba zrezygnowałem z AdvancedUserInterface i sprawdzam "ręcznie" co potrzeba, ponieważ i tak już wcześniej musiałem zdefiniować Handlery logowania. Event listener nic nie zmieni, exception dostanę takie samo, Token->getUser() nie zwróci instancji użytkownika tylko string z loginem i dalej stoję przed problemem jak sprawdzić znaleźć użytkownika.

Pytanie moje dotyczyło jak fizycznie nadpisać definicję tej klasy. Zdefiniowane jest jako: <parameter key="security.authentication.manager.class">Symfony\Component\Security\Core\Authentication\AuthenticationProviderManager</parameter>.
I teraz jak powinienem to zmienić z poziomu swojego bundla ? (Nie do końca orientuję się czy jakoś przez Extension się dostanę czy może potrzebuję jakiegoś CompilerPass itd.)
netmare
Coś nie mogę znaleźć jak powienienem to zadeklarować.
ano
Tak tak, z tego co pamiętam jedynym rozwiązaniem jest praktycznie skopiowanie tamtej klasy i wstawienie jej w DI. Powinnieneś móc to zrobić tak jak napisałeś (parameter).
Ale jeżeli nie chcesz kopiować tamtej klasy to możesz na chama pobierac z tamtego exceptiona username i samemu "jeszcze raz" go pobierac z bazy/czegokolowiek (user provider?).
Też się zastanawiałem czemu tam usuwają informację o obiekcie Usera... ;-/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.