Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][Symfony2] Historia logowań FOSUserBundle
rcetra
post
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 16.12.2011

Ostrzeżenie: (0%)
-----


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?

Ten post edytował rcetra 31.01.2012, 15:58:50
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
ano
post
Post #3





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
rcetra
post
Post #4





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 16.12.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
rcetra
post
Post #6





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 16.12.2011

Ostrzeżenie: (0%)
-----


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ę?
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
rcetra
post
Post #8





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 16.12.2011

Ostrzeżenie: (0%)
-----


Niestety, security.authentication, po prostu jest na liście tych niewywołanych :-(
Go to the top of the page
+Quote Post
ano
post
Post #9





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
AxZx
post
Post #10





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


udało się komuś podziałać coś z tymi eventami?

Go to the top of the page
+Quote Post
destroyerr
post
Post #11





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
AxZx
post
Post #12





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


ja też to sprawdzałem i security.authentication.failure było w eventach, no bo w serwisie go dodaliśmy, prawda?(IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
rcetra
post
Post #13





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 16.12.2011

Ostrzeżenie: (0%)
-----


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?(IMG:style_emoticons/default/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.

Ten post edytował rcetra 20.02.2012, 11:36:31
Go to the top of the page
+Quote Post
destroyerr
post
Post #14





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kubaSN
post
Post #15





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 17.02.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 04:34