Как прослушать событие выхода из системы, чтобы записать событие в базу данных? - PullRequest
0 голосов
/ 25 марта 2020

Когда пользователь подключается к приложению, слушатель обнаруживает событие подключения и обновляет поле last_login_at для пользователя.

Проблема возникает, когда пользователь хочет выйти из системы.

При отключении всегда вызывается метод слушателя onSecurityAuthenticationSuccess.

Проблема после отключения мы больше не можем восстановить пользователя (в сеансе)

Что я хотел бы - это иметь возможность записывать дату последнего соединения в базе данных, которая называется методом onSecurityAuthenticationSuccess, только при входе в систему, а не при входе в систему и выходе из системы.

Кроме того, у меня есть поле is_in_line в базе данных, и я хотел бы отключиться , Я могу обнаружить событие «отключение» и обновить это поле. Как я могу это сделать?

Вот мой код для перечисления

public function onSecurityAuthenticationSuccess (AuthenticationEvent $ event) {
 
    $ user = $ event-> getAuthenticationToken () -> getUser ();
 
    if ($ user) {
     
        // dd ($ user);
        $ user-> setLastLoginAt (new \ Datetime ('now'));
 
        $ this-> em-> persist ($ user);
        $ this-> em-> flush ();
    }
}

1 Ответ

0 голосов
/ 25 марта 2020

Вы должны быть осторожны при использовании события security.authentication.success, поэтому оно вызывается каждый раз, когда пользовательский сеанс является действительным и успешно аутентифицирован, что означает, что при каждом refre sh или подзапросе вы обновляете свою сущность. Это происходит, когда вы включаете always_authenticate_before_granting для аутентификации на основе сеанса.

Вместо этого вы можете использовать security.interactive_login. См. InteractiveLoginEvent

Когда вам нужно обновить свою сущность при выходе пользователя, вы можете прослушать событие security.logout_on_change. Он предоставляет оригинальный токен, который вы можете получить идентификатор пользователя или другие свойства токена. См. DeauthenticatedEvent

Пример:

public function onInteractiveLogin(InteractiveLoginEvent $event): void
{
    $user = $event->getAuthenticationToken()->getUser();

    $this->updateUserLastLogin($user);
}


public function onDeauthenticated(DeauthenticatedEvent $event): void
{
    $user = $event->getOriginalToken()->getUser();

    $this->updateUserLastLogin($user);
}

private function updateUserLastLogin($user): void
{
    if ($user) {

        $user->setLastLoginAt(new \Datetime('now'));

        $this->em->persist($user);
        $this->em->flush();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...