Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Symfony2] Historia logowań FOSUserBundle
Forum PHP.pl > Forum > PHP > Frameworki
rcetra
Witam,
może ktoś robił i podpowie, w któym miejscu się wpiąć w FOSUserBundle, żeby móc zapisywać historię wszystkich logowań.
Sam formularz logowania kieruje do akcji /login_check, ale niestety nie wiem, jak mogę do niej uzyskać dostęp. Sam SecurityController.php daje możliwość nadpisania metody, ale jest w niej tylko
  1. public function checkAction()
  2. {
  3. throw new \RuntimeException('You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.');
  4. }
Chodzi mi o zapisywanie w bazie lub pliku logowań nieudanych i udanych. Jakaś podpowiedź?

--
Znalazłem coś takiego: http://dariussadowski.com/2011/10/symfony-...ytkownikow.html jutro wypróbuję.
Może ktoś podpowie jeszcze jakiś dobry link o listenerach?
Crozin
Podepnij własnego listenera dla zdarzenia security.* (nie wiem który to dokładnie, będziesz musiał poszukać) i tam zapisz informację o (nie)udanym logowaniu.
ano
security.interactive_login to nazwa zdarzenia, które wywołuje się przy logowaniu.

A tak a'propo: nie macie może jakiejś ściągi z listą wszystkich/większości zdarzeń, które dzieją się w Symfony2 (w standardowej paczce)?
Czy oprócz:
kernel.request
kernel.controller
kernel.response
są jeszcze jakieś godne uwagi?
rcetra
Cytat(ano @ 31.01.2012, 21:23:50 ) *
security.interactive_login to nazwa zdarzenia, które wywołuje się przy logowaniu.


Właśnie, wywołuje się tylko przy poprawnym logowaniu, a potrzebuję też logować próby nieudane. Szukałem w piątek, szukam dzisiaj od kilku godzin i przeszukuję kod, ale nie mogę namierzyć niestety poprawnego eventu. Podpowiedzcie coś, jeśli używacie. Mignęło mi kiedyś coś o zmiane statusu autoryzacji, ale nie mogę tego znów namierzyć. Wiem, że umożliwiał właśnie wywołanie (jeśli dobrze zapamiętałem) moment zalogowania, wylogowania, nie wiem jak z nieudanymi próbami.
Crozin
Główny fragment kodu odpowiedzialnego za logowanie: https://github.com/symfony/symfony/blob/mas...Manager.php#L61
Jak widać jest tam wywołanie odpowiednich zdarzeń dla poprawnego i błędnego logowania, tak więc zdarzenia jakich szukasz to: security.authentication.success/failure (przy czym raczej zapisz to sobie w formie stałych).
rcetra
Cytat(Crozin @ 6.02.2012, 12:39:34 ) *
Główny fragment kodu odpowiedzialnego za logowanie: https://github.com/symfony/symfony/blob/mas...Manager.php#L61
Jak widać jest tam wywołanie odpowiednich zdarzeń dla poprawnego i błędnego logowania, tak więc zdarzenia jakich szukasz to: security.authentication.success/failure (przy czym raczej zapisz to sobie w formie stałych).


Wypróbowałem obydwa, niestety ani jeden ani drugi się nie wywołuje. Tak wygląda definicja serwisu w config.yml:
  1. services:
  2. kernel.listener.LoginHistoryListener:
  3. class: BDK\UserBundle\Listener\LoginHistoryListener
  4. arguments: [@service_container]
  5. tags:
  6. - { name: kernel.event_listener, event: security.authentication.success }
Sam listener zawiera odpowiednią metodę:
  1. public function onSecurityAuthenticationSuccess (Event $event)
  2. {[...]}
Niestety nawet:
  1. var_dump($event);
Zupełnie nie reaguje. Symfonia sama podpowiada, jeżeli konfiguracja jest błędna (czyli brakuje jej metody). Przy security.interactive_login wszystko działało (oczywiście metoda klasy inaczej się nazywała). Może coś źle robię?
Crozin
Skorzystaj z debuggera i sprawdź jak kod zachowuje się w metodzie authenticate(). Od razu będziesz widział jak kod się wykonuje, czy EventDispatcher ma podpięte odpowiednie zdarzenia itd.
rcetra
Niestety, security.authentication, po prostu jest na liście tych niewywołanych :-(
ano
Kod
services:
    kernel.listener.LoginHistoryListener:
        class: BDK\UserBundle\Listener\LoginHistoryListener
        arguments: ['@service_container']
        tags:
            - { name: kernel.event_listener, event: security.authentication.success, method: onSecurityAuthenticationSuccess}


zamień tamten kod na ten. I radzę teksty ze znakami specjalnymi (@ / : i inne 'nietypowe') umieszczać w apostrofach/cudzysłowach. (inaczej jest to niezgodne ze standardem YAMLa i niektóre parsery mogą się na tym wywalić. (chociażby Eclipsowy YEdit)
AxZx
udało się komuś podziałać coś z tymi eventami?

destroyerr
Sprawdziłem właśnie u siebie i działa zarówno security.authentication.failure jak i security.authentication.success. Konfiguracja prawie identyczna jak wyżej (zmieniłem tylko nazwę swojego listenera).

Cytat
Niestety, security.authentication, po prostu jest na liście tych niewywołanych :-(

Jesteś pewien? Po wysłaniu formularza logowania zwróciło Ci jakąś stronę, wszedłeś w profilera i na liście nie wywołanych zdarzeń znalazłeś obydwa (success i failure)? Jeśli tak to nie ma się co dziwić, bo zobaczyłeś zdarzenia dla ostatnio wyświetlonej strony. Powinieneś wyszukać (panel z lewej) żądania, które wysyłało formularz logowania.
AxZx
ja też to sprawdzałem i security.authentication.failure było w eventach, no bo w serwisie go dodaliśmy, prawda?smile.gif
ale nie był ten event obłsługiwany, tzn jeżeli w metodzie podłączonej wpisałem jakiś wyjątek czy coś to niestety nic z tej metody się nie wykonywało.
rcetra
Cytat(AxZx @ 14.02.2012, 16:44:43 ) *
ja też to sprawdzałem i security.authentication.failure było w eventach, no bo w serwisie go dodaliśmy, prawda?smile.gif
ale nie był ten event obłsługiwany, tzn jeżeli w metodzie podłączonej wpisałem jakiś wyjątek czy coś to niestety nic z tej metody się nie wykonywało.

Dopiero teraz się za to wziąłem i niestety mam tak samo. Zdefiniowałem w swoim services.yml:
  1. kernel.listener.LoginHistoryListener:
  2. class: BDK\UserBundle\Listener\LoginHistoryListener
  3. arguments: ["@service_container"]
  4. tags:
  5. - { name: kernel.event_listener, event: security.authentication.success, method: onSecurityAuthenticationSuccess }
  6. - { name: kernel.event_listener, event: security.authentication.failure, method: onSecurityAuthenticationFailure }
  7. - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }

Sama klasa ma:
  1. namespace BDK\UserBundle\Listener;
  2. use Symfony\Component\HttpFoundation\Request;
  3. use Symfony\Component\HttpKernel\HttpKernelInterface;
  4. use Symfony\Component\EventDispatcher\EventDispatcher;
  5. use Symfony\Component\EventDispatcher\Event;
  6. use Symfony\Component\HttpFoundation\Session;
  7. use BDK\UserBundle\Entity\User as User;
  8.  
  9. class LoginHistoryListener {
  10.  
  11. public function __construct ($serviceContainer)
  12. {
  13. $this->request = $serviceContainer->get('request');
  14. $this->em = $serviceContainer->get('doctrine')->getEntityManager();
  15. $this->logger = $serviceContainer->get('authlog');
  16. $this->security = $serviceContainer->get('security.context');
  17. }
  18.  
  19. public function onSecurityAuthenticationSuccess (Event $event)
  20. {
  21. $this->logger->info('onSecurityAuthenticationSuccess');
  22. }
  23.  
  24. public function onSecurityAuthenticationFailure (Event $event)
  25. {
  26. $this->logger->info('onSecurityAuthenticationFailure');
  27. }
  28. }


...i niestety nie działa ani trochę. W debugerze pdo Events jest w "Not Called Listeners":

  1. security.authentication.failure LoginHistoryListener::onSecurityAuthenticationFailure
  2. security.authentication.success LoginHistoryListener::onSecurityAuthenticationSuccess

po prostu ani trochę to nie chce działać, nie potrafię w to zakląć ani trochę życia :-(

help?

P.S. Event security.interactive_login uruchamia się odpowiednią z metodą i ten działa tak jak powinien. Dalej po prostu nie mam władzy nad momentem kiedy ktoś mi się loguje ale bez powodzenia. O to rzecz się cała rozchodzi, jakby ktoś zapomniał. Chcę mieć informację, że ktoś się próbował logować ale mu nie wyszło.
destroyerr
Cytat
...i niestety nie działa ani trochę. W debugerze pdo Events jest w "Not Called Listeners":


Jesteś pewien? Po wysłaniu formularza logowania zwróciło Ci jakąś stronę, wszedłeś w profilera i na liście nie wywołanych zdarzeń znalazłeś obydwa (success i failure)? Jeśli tak to nie ma się co dziwić, bo zobaczyłeś zdarzenia dla ostatnio wyświetlonej strony. Powinieneś wyszukać (panel z lewej) żądania, które wysyłało formularz logowania.
Ewentualnie wyeksportuj dane z debugera i wrzuć je gdzieś do pobrania.
kubaSN
Witam.

W paczce Symfony 2.0.11 nie ma eventow security.authentication.success oraz security.authentication.failure. Na githubie sa dodane, jednak w oficjalnej paczce ich nie ma.
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.