【问题标题】:Logout does not destroy/clear session properly in FOSUserBundle注销不会在 FOSUserBundle 中正确销毁/清除会话
【发布时间】:2015-03-03 04:43:25
【问题描述】:

我遇到了一些问题,不知道为什么,当我从由 FOSUserBundle 处理的应用程序中注销时,因为当前会话永远不会被破坏甚至清除在我重新登录时导致问题的原因我存储了一些数据会议。这就是我的security.yml 的样子:

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_USER: ROLE_USER
        ROLE_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                login_path:  /login
                check_path:  /login_check
                default_target_path: home
                always_use_default_target_path: true
            logout:
                 path: fos_user_security_logout
                 target: /
                 invalidate_session: false
            anonymous: ~

    access_control:
        ...    

这就是session 键在config.yml 上的配置方式:

session:
    # handler_id set to null will use default session handler from php.ini
    handler_id:  ~
    cookie_lifetime: 86400
    gc_maxlifetime: 600 # session will expire after 10 minutes of inactivity
    gc_probability: 1
    gc_divisor: 1

我在这里遗漏了其他东西?

作为这个问题的第二部分,我有一个很大的疑问,因为这对我来说是新事物,并且与 Symfony2 中垃圾收集的工作方式有关?我正在阅读docs,但我不清楚,我也不知道这是否是原因,因为当我从应用程序注销时会话没有正确销毁。对此有什么解释吗?如果我没记错的话,我的应用程序会自动注销用户,当 10 分钟没有做任何事情时,这意味着 不活动,我是对的吗?但是 GC 部分在这个配置上是如何或做什么的呢?我从 this 主题中获取了该配置,但还没有理解。

另外说明,我在私人窗口中都使用 Firefox|Chrome,因此不应该存在来自浏览器的缓存。

【问题讨论】:

  • 我很好奇可能的答案,因为我在退出 fosuserbundle 时也注意到了这个问题。
  • 您遇到的实际问题是什么?您说的是注销问题,但不清楚您具体遇到了什么。
  • 基本上,用户的会话在退出后仍然保持活动状态。

标签: php symfony session garbage-collection


【解决方案1】:

security.yml 文件中的invalidate_session 选项默认设置为true,在您的配置中其false,尝试将其更改为true

为了澄清,这里是来自SecurityExtension.php的代码

if (true === $firewall['logout']['invalidate_session'] && false === $firewall['stateless']) {
    $listener->addMethodCall('addHandler', array(new Reference('security.logout.handler.session')));
}

'security.logout.handler.session':

public function logout(Request $request, Response $response, TokenInterface $token)
{
    $request->getSession()->invalidate();
}

....

【讨论】:

  • 显然,这行得通,我现在接受你的回答,因为我需要做更多的测试,但如果我有任何问题我会回来,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2012-06-04
  • 2016-03-21
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多