#logging #symfony4
#ведение журнала #symfony4
Вопрос:
Я следовал приведенному здесь руководству и внедрил базовую систему аутентификации: https://symfony.com/doc/current/security.html
Тем не менее, я хотел бы добавить системные журналы в свое приложение. Если быть точным, я бы хотел:
- чтобы иметь возможность вставить запись о том, кто и в какое время успешно вошел в систему
- чтобы иметь возможность записывать, когда кто-то пытался войти в систему и потерпел неудачу
Я знаю, что могу помещать журналы в свой SecurityController, вот так:
public function login(AuthenticationUtils $authenticationUtils, Request $request, EntityManagerInterface $em): Response
{
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
$log = new Logs();
$em->persist($log);
$log->setAction('auth')
->setDate(new DateTime())
->setIp($request->getClientIp());
$em->flush();
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
но это дает мне только информацию о том, что кто-то был на странице входа. Что мне изменить или добавить, чтобы получить другую информацию?
Комментарии:
1. Обычный способ получить полный контроль над вашей логикой аутентификации — это внедрить Guard Authenticator .
Ответ №1:
Я думаю, это решит вашу проблему.
Вы должны делать это с помощью Symfony events. Эти 2 события, запускающиеся после неудачных / успешных попыток входа в систему: security.authentication.success
и security.authentication.failure
.
Я приведу пример успешного выполнения, и вы сможете применить его при сбое:
-
Добавьте это в свой
config/service.yml
AppEventListenerSuccessLoginListener: tags: - { name: 'kernel.event_listener', event: 'security.authentication.success'}
-
Затем вы можете создать прослушиватель и выполнить в нем процесс протоколирования
namespace AppEventListener; use DoctrineORMEntityManagerInterface; use SymfonyComponentSecurityHttpEventAuthenticationSuccessEvent; class SuccessLoginListener { private $em; public function __construct(EntityManagerInterface $em) { $this->em = $em; } public function onSecurityAuthenticationSuccess(AuthenticationSuccessEvent $event) { // TODO: Create your log entity at here. } }
Комментарии:
1. Спасибо, это работает, но это также создает дополнительные журналы во время операции выхода из системы и когда я просто нажимаю кнопку «Войти». Есть идеи, как обрабатывать это отдельно?
2. Я рад видеть, что это решает вашу проблему. Вам следует проверить другие события аутентификации Symfony security.