Symfony2 PDOSessionHandler允许我查看一个页面,然后踢出去

时间:2013-06-07 22:57:28

标签: session symfony pdo doctrine

我正在尝试为我的Symfony2设置实现PDOSessionHandler。

它允许我登录并带我到第一页。但是当我尝试在其他任何地方导航时,它会将我带回登录页面。

我知道我不是想跳防火墙或任何东西,因为它与默认会话(文件中的会话)完美配合。我创建了会话表,并编写了会话。当我重新登录时,它会保持相同的会话ID,但它仍然不会让我超过第一页。

我还确保正确设置服务器时间。我的数据库在这个环境中运行在我的Web服务器上,我已经验证他们都使用了正确的时间。

该表看起来像这样(MySQL):

CREATE TABLE `session` (
  `session_id` varchar(255) NOT NULL,
  `session_value` text NOT NULL,
  `session_time` int(11) NOT NULL,
  PRIMARY KEY (`session_id`),
  UNIQUE KEY `session_id_UNIQUE` (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我使用以下配置:

framework:
  session:
    handler_id: session.handler.pdo

parameters:
  pdo.db_options:
    db_table:    session
    db_id_col:   session_id
    db_data_col: session_value
    db_time_col: session_time

services:
  pdo:
    class: PDO
    arguments:
      - "mysql:host=%database_host%;port=%database_port%;dbname=%database_name%"
      - "%database_user%"
      - "%database_password%"
  session.handler.pdo:
    class:     Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
    arguments: ["@pdo", "%pdo.db_options%"]

我也使用最新版本的Symfony(2.3)。

我也使用令牌做了一些事情,并且有一个自定义身份验证提供程序,但是不要做任何应该使会话本身无效的事情。

有什么想法吗?

感谢。


更新

我刚注意到在会话中,它总是保留我的_security.firewall.target_path属性,但似乎丢失了_security_firewall属性(“防火墙”实际上是播放中特定防火墙的名称)。希望能给别人一个想法。

2 个答案:

答案 0 :(得分:0)

确保您的其他操作中的会话正确启动,从而将您重定向到登录。

$this->container->get('session')->isStarted()

如果您再次登录时收到相同的会话ID,则听起来不会使sesion失效。

答案 1 :(得分:0)

我很可能患上某种“种族”状况。看起来有一个官方的Symfony错误跟踪这个,虽然它似乎证明相当难以准确确定。

Symfony Bug Tracker Issue 6417