Вот хороший способ убить пользовательские сеансы: используйте EventListener
с событием onKernelRequest
. В вашем основном коде: public function onKernelRequest(KernelEvent $event)
$request = $event->getRequest();
$token = $this->container->get('security.token_storage')->getToken();
if ($token === null) { // somehow
return;
}
if ($token->getUser()->isLocked() === true) {
// you must implement a boolean flag on your user Entities, which the admins can set to false
$this->container->get('security.token_storage')->setToken(); // default is null, therefore null
$request->getSession()->invalidate(); // these lines will invalidate user session on next request
return;
}
Теперь перейдем к другому вашему вопросу: как составить список пользователей с их онлайн-статусом? Легко, ваши пользовательские объекты должны реализовать другой логический флаг, такой как isOnline
(с геттером и сеттером).
Затем вы должны создать LoginListener
(не нужно реализовывать какой-либо интерфейс). И в вашем основном коде:
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) {
$user = $event->getAuthenticationToken()->getUser();
if ($user instanceof UserInterface) {
// set isOnline flag === true
// you will need to fetch the $user with the EntityManager ($this->em)
// make sure it exists, set the flag and then
$this->em->flush();
}
}
Ваше третье событие должно быть LogoutListener
, где вы установите isOnline flag === false
Symfony вызывает LogoutListener (в качестве обработчика), когда пользователь запрашивает выход из системы. Но вы можете написать свой собственный:
class LogoutListener implements LogoutHandlerInterface {
public function logout(Request $request, Response $response, TokenInterface $token): void
{
$user = $token->getUser();
if (!$user instanceof UserInterface) { /** return if user is somehow anonymous
* this should not happen here, unless... reasons */
return;
}
// else
$username = $user->getUsername(); // each user class must implement getUsername()
// get the entity Manager ($this->em, injected in your constructor)
// get your User repository
$repository = $this->em->getRepository(MyUser::class);
$user = $repository->findOneBy(['username' => $username]); // find one by username
$user->setIsOnline(false);
$this->em->flush(); // done, you've recorded a logout
}
}
Надеюсь это поможет. Если повезет, так и будет. Ваше здоровье! :-)
person
Hugues D
schedule
11.11.2019