Как мне создать системные журналы во время аутентификации?

#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 .

Я приведу пример успешного выполнения, и вы сможете применить его при сбое:

  1. Добавьте это в свой config/service.yml

     AppEventListenerSuccessLoginListener:
    tags:
        - { name: 'kernel.event_listener', event: 'security.authentication.success'}
      
  2. Затем вы можете создать прослушиватель и выполнить в нем процесс протоколирования

     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.