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

我有一个很长时间的项目

  • 显示所有活动用户会话的列表。 例如:当有人使用我的登录名/密码时,我希望看到它

  • 删除一些会话。 例如:如果我知道某个会话是罪犯,我可以将其删除

  • 我在Symfony官方文档中找到了如何安装,但我不明白如何在那里设置用户id,以便通过此参数搜索会话

    默认情况下,Db会话处理程序的表结构为:

    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),以查找当前用户的会话并显示有关他的信息

  • 创建自定义处理程序
  • config.yml

    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
    列中。创建会话时,您在何处将用户名和代理传递给会话?