gpt4 book ai didi

php - 交响乐 4 : Logout active user by admin

转载 作者:行者123 更新时间:2023-12-04 12:38:25 26 4
gpt4 key购买 nike

我的 Symfony 4.2 应用程序中的管理员用户应该能够注销另一个(非管理员)用户。我根据 Symfony 安全包 ( https://symfony.com/doc/current/security/form_login_setup.html ) 创建了一个用户登录系统。

现在我正在构建一个管理仪表板,其中必须列出所有用户及其在线状态(上次事件)。

是否有推荐的方法来列出活跃用户并在需要时终止他们的 session ?

我读过一些这样的帖子:Symfony how to return all logged in Active Users .但答案有点陈旧,只是列出活跃用户。

最佳答案

正确的做法是将用户 session 存储在数据库中。

https://symfony.com/doc/current/doctrine/pdo_session_storage.html (这里是创建数据库表的语法,同时在表中添加一个user_id)

在 framework.yml 中添加 Pdo session 处理程序。

session:    
handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
cookie_secure: auto
cookie_samesite: lax

在service.yml中添加监听器并注册session handler

 # Handlers
Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler:
arguments:
- !service { class: PDO, factory: 'database_connection:getWrappedConnection' }
- { lock_mode: 1 }

# Listeners
App\Listener\SessionListener:
tags:
- {name: kernel.event_listener, event: kernel.request, method: onRequestListener}

中创建一个新的监听器
class SessionListener
{

/**
* @var TokenStorageInterface
*/
private $tokenStorage;

/**
* @var EntityManagerInterface
*/
private $em;

/**
* @var SessionInterface
*/
private $session;

public function __construct(
TokenStorageInterface $tokenStorage,
EntityManagerInterface $em,
SessionInterface $session
) {
$this->tokenStorage = $tokenStorage;
$this->em = $em;
$this->session = $session;
}

public function onRequestListener(GetResponseEvent $event): void
{

// If its not te master request or token is null
if (!$event->isMasterRequest() || $this->tokenStorage->getToken() === null) {
return;
}

/** @var User $user */
$user = $this->tokenStorage->getToken()->getUser();

// Check if user is logged in
if (!$user instanceof User) {
return;
}

$connection = $this->em->getConnection();

try {
$stmt = $connection->prepare('UPDATE `sessions` SET `user_id` = :userId WHERE `sess_id` = :sessionId');
$stmt->execute([
'userId' => $user->getId(),
'sessionId' => $this->session->getId(),
]);
} catch (DBALException $e) {
}
}
}

现在只需删除该用户的 session 即可。

 /**
* @var EntityManagerInterface
*/
private $em;

public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}

public function delete(User $user): void
{
$sessions = $this->em->getRepository(Session::class)->findBy([
'user' => $user,
]);

foreach ($sessions as $session) {
$this->em->remove($session);
}

$this->em->flush();
}

关于php - 交响乐 4 : Logout active user by admin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57196990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com