php - 注销不会在 FOSUserBundle 中正确销毁/清除 session

标签 php symfony session garbage-collection

我遇到了一些问题,不知道为什么,当我从由 FOSUserBundle 处理的应用程序注销时,因为当前 session 从未被破坏甚至清除,这在我重新登录时导致问题,因为我存储了一些数据 session 。这是我的 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 key 在 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围绕它但我不清楚,我也不知道这是否是原因,因为当我从应用程序注销时 session 没有被正确销毁。对此有什么解释吗?如果我没记错的话,我的应用程序会在 10 分钟内无所事事地自动注销用户,这意味着不活动,我是对的吗?但是 GC 部分在此配置上如何或做什么?我从 this 中获取该配置主题,但还不理解那个。

作为附加说明,我在私有(private)窗口中使用 Firefox|Chrome,因此不应存在来自浏览器的缓存。

最佳答案

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();
}

....

关于php - 注销不会在 FOSUserBundle 中正确销毁/清除 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27783019/

相关文章:

c# - webpart context.session 为空

laravel - 数据在 Laravel session 中持续多长时间?

php - 从 Wordpress 中的 style.css 文件获取主题信息

php - 在 mysql_query 字符串中使用 PHP 变量

php - 如何在 php 中的 foreach 语句的每三个结果上输出一个值?

jquery - Symfony2 中的 Composer 创建两次相同的资源(jquery、jqueryui)

java - 如何使用 session 工厂提高批量插入的性能

php - 更新与输入 SQL 表的问题

php - 获取 Akeneo 中的类别列表

php - require_once() 和 autoloader - 如何加载平面 php?