Php 如何在symfony2中显示所有用户会话?如何杀死他们中的一些人? 我需要在Symfony2中管理用户会话。
我有一个很长时间的项目Php 如何在symfony2中显示所有用户会话?如何杀死他们中的一些人? 我需要在Symfony2中管理用户会话。,php,symfony,session,Php,Symfony,Session,我有一个很长时间的项目 显示所有活动用户会话的列表。 例如:当有人使用我的登录名/密码时,我希望看到它 删除一些会话。 例如:如果我知道某个会话是罪犯,我可以将其删除 我在Symfony官方文档中找到了如何安装,但我不明白如何在那里设置用户id,以便通过此参数搜索会话 默认情况下,Db会话处理程序的表结构为: CREATE TABLE `sessions` ( `sess_id` VARBINARY(128) NOT NULL PRIMARY KEY, `sess_data` B
CREATE TABLE `sessions` (
`sess_id` VARBINARY(128) NOT NULL PRIMARY KEY,
`sess_data` BLOB NOT NULL,
`sess_time` INTEGER UNSIGNED NOT NULL,
`sess_lifetime` MEDIUMINT NOT NULL
) COLLATE utf8_bin, ENGINE = InnoDB;
嗯。我找到了解决办法!)我使用pdo处理程序,然后添加两个字段(user_id和agent),以查找当前用户的会话并显示有关他的信息
framework:
handler_id: session.handler.pdo.custom
服务.yml
services:
session.handler.pdo.custom:
class: YourBundle\HttpFoundation\Session\Storage\Handler\UserIdPdoSessionHandler
public: true
arguments:
- "pgsql:host=%database_host%;dbname=%database_name%"
- { db_username: %database_user%, db_password: %database_password% }
- @security.token_storage
表的SQL语句
CREATE TABLE sessions (sess_id VARCHAR(128) NOT NULL, sess_data BYTEA NOT NULL, sess_time INT NOT NULL, sess_lifetime INT NOT NULL, user_id INT DEFAULT NULL, server_addr VARCHAR(255) DEFAULT NULL, agent TEXT DEFAULT NULL, PRIMARY KEY(sess_id))
创建控制器操作以显示会话:
/**
* @Route(name="user_profile_sessions_list", path="/sessions")
*
* @param Request $request
*
* @return Response
*/
public function sessionsListAction(Request $request)
{
$user = $this->getUser();
$sessions = $this->get('session.handler.pdo.custom')->getSessionsByUserId($user->getId());
return $this->render('YourBundle:Profile:sessions.html.twig', array(
'sessions' => $sessions,
));
}
/**
* @Route(name="user_profile_sessions_delete", path="/sessions/delete/{sessionId}")
*
* @param Request $request
*
* @return Response
*/
public function sessionDeleteAction(Request $request, $sessionId)
{
$em = $this->getDoctrine()->getManager();
//Удалим сессию из БД (если это текущая сессия, то сделаем logout)
if ($sessionId == $this->get('session')->getId()) {
$redirect = $this->redirect($this->generateUrl('fos_user_security_logout'));
} else {
$this->get('session.handler.pdo.custom')->destroy($sessionId, $this->getUser()->getId());
$redirect = $this->redirect($this->generateUrl('user_profile_sessions_list'));
}
return $redirect;
}
创建控制器操作以删除会话:
/**
* @Route(name="user_profile_sessions_list", path="/sessions")
*
* @param Request $request
*
* @return Response
*/
public function sessionsListAction(Request $request)
{
$user = $this->getUser();
$sessions = $this->get('session.handler.pdo.custom')->getSessionsByUserId($user->getId());
return $this->render('YourBundle:Profile:sessions.html.twig', array(
'sessions' => $sessions,
));
}
/**
* @Route(name="user_profile_sessions_delete", path="/sessions/delete/{sessionId}")
*
* @param Request $request
*
* @return Response
*/
public function sessionDeleteAction(Request $request, $sessionId)
{
$em = $this->getDoctrine()->getManager();
//Удалим сессию из БД (если это текущая сессия, то сделаем logout)
if ($sessionId == $this->get('session')->getId()) {
$redirect = $this->redirect($this->generateUrl('fos_user_security_logout'));
} else {
$this->get('session.handler.pdo.custom')->destroy($sessionId, $this->getUser()->getId());
$redirect = $this->redirect($this->generateUrl('user_profile_sessions_list'));
}
return $redirect;
}
如果需要,可以创建实体:
<?php
namespace Uip\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Sessions
*
* @ORM\Table(name="sessions")
* @ORM\Entity
*/
class Sessions
{
/**
* @var string
* @ORM\Id
* @ORM\Column(name="sess_id", type="string", length=128, nullable=false)
*/
private $sessId;
/**
* @var string
* @ORM\Column(name="sess_data", type="blob", nullable=false)
*/
private $sessData;
/**
* @var integer
* @ORM\Column(name="sess_time", type="integer", nullable=false)
*/
private $sessTime;
/**
* @var integer
* @ORM\Column(name="sess_lifetime", type="integer", nullable=false)
*/
private $sessLifetime;
/**
* @var integer
* @ORM\Column(name="user_id", type="integer", nullable=true)
*/
private $userId;
/**
* @var string
* @ORM\Column(name="server_addr", type="string", nullable=true)
*/
private $serverAddr;
/**
* @var string
* @ORM\Column(name="agent", type="text", nullable=true)
*/
private $agent;
/**
* Get sessId
*
* @return string
*/
public function getSessId()
{
return $this->sessId;
}
/**
* Get sessData
*
* @return string
*/
public function getSessData()
{
return $this->sessData;
}
/**
* Set sessData
*
* @param string $sessData
* @return Sessions
*/
public function setSessData($sessData)
{
$this->sessData = $sessData;
return $this;
}
/**
* Get sessTime
*
* @return integer
*/
public function getSessTime()
{
return $this->sessTime;
}
/**
* Set sessTime
*
* @param integer $sessTime
* @return Sessions
*/
public function setSessTime($sessTime)
{
$this->sessTime = $sessTime;
return $this;
}
/**
* Get sessLifetime
*
* @return integer
*/
public function getSessLifetime()
{
return $this->sessLifetime;
}
/**
* Set sessLifetime
*
* @param integer $sessLifetime
* @return Sessions
*/
public function setSessLifetime($sessLifetime)
{
$this->sessLifetime = $sessLifetime;
return $this;
}
/**
* Get userId
*
* @return integer
*/
public function getUserId()
{
return $this->userId;
}
/**
* Set userId
*
* @param integer $userId
* @return Sessions
*/
public function setUserId($userId)
{
$this->userId = $userId;
return $this;
}
/**
* Get serverAddr
*
* @return string
*/
public function getServerAddr()
{
return $this->serverAddr;
}
/**
* Set serverAddr
*
* @param string $serverAddr
* @return Sessions
*/
public function setServerAddr($serverAddr)
{
$this->serverAddr = $serverAddr;
return $this;
}
/**
* Get agent
*
* @return string
*/
public function getAgent()
{
return $this->agent;
}
/**
* Set agent
*
* @param string $agent
* @return Sessions
*/
public function setAgent($agent)
{
$this->agent = $agent;
return $this;
}
}
您必须实现自己的自定义会话处理程序或找到第三个捆绑包。Symfony无法使用默认安装为您做到这一点。有关用户的信息以序列化形式出现在sess\u data
列中。创建会话时,您在何处将用户名和代理传递给会话?