注销不会在FOSUserBundle中正确销毁/清除会话

Rey*_*rPM 5 php session garbage-collection symfony

我有一些问题,不知道为什么,当我从我的应用程序退出时由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:
        ...    
Run Code Online (Sandbox Code Playgroud)

这就是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
Run Code Online (Sandbox Code Playgroud)

我在这里错过了别的什么?

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

另外请注意,我在私有窗口中使用Firefox | Chrome,因此不存在来自浏览器的缓存.

xur*_*d29 10

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

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

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

并且'security.logout.handler.session':

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

....