0

我在 Symfony 2.3 中使用“记住我”自动登录,非常标准的配置:

security:
    firewalls:
    secured_auth:
        (...)
        remember_me:
            key: RememberMeKey
            lifetime: 5184000
            path: /
            domain: ~

我正在使用 Redis 会话处理程序(本机 PHP Redis 会话模块)。

它按预期工作,这里没问题。长时间后第一次进入网站后,用户自动登录。

问题是我需要在我的控制器中使用会话 ID(实际上它被传递给视图,在视图中它被用作 AJAX 访问的外部服务的身份验证密钥)。要在我使用的控制器中获取会话 ID $this->get('session')->getId(),通常它工作得很好,除了当用户第一次进入站点并且他使用记住我令牌自动登录时。对于这一请求,控制器中$this->get('session')->getId()(或session_id())返回的会话 ID 是一个空字符串。重新加载页面后,一切正常。

现在想到的唯一想法是根本不在控制器中使用会话 ID,而是从 JavaScript 客户端的 cookie 中获取它,但这不是一个很好的解决方案。自动登录后如何在控制器中获取会话 ID?我希望我清楚自己。

4

1 回答 1

1

我会为后代回答我自己的问题...

这是 Symfony 的一个问题:

https://github.com/symfony/symfony/issues/9255

肮脏的解决方法是在身份验证处理程序中手动启动自动登录会话

public function onAuthenticationInteractiveLogin(InteractiveLoginEvent $e) {
    $token = $e->getAuthenticationToken();
    $request = $e->getRequest();

    if($token instanceof Token\RememberMeToken) {
        $url = $request->getRequestUri();

        $this->session->start();
        $this->userProvider->refreshUser($token->getUser());
    }
}
于 2014-04-02T08:32:59.050 回答