2015-01-05 183 views
3

我遇到一些问题,不知道为什么,当我从我的应用程序中注销时,由FOSUserBundle处理,因为当前会话永远不会被销毁,甚至无法清除哪些会导致问题当我重新登录时,因为我在会话中存储了一些数据。这是我的security.yml看起来像:注销不会在FOSUserBundle中正确销毁/清除会话

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浏览器在私人窗口中工作,因此不存在来自浏览器的缓存。

+0

我很好奇,一个可能的答案,因为我注意到这个问题也在我从fosuserbundle注销。 – Matheno

+0

你有什么实际问题?你说注销问题,但它不完全清楚你正在经历什么。 –

+0

基本上,用户的会话在注销后保持活动状态。 – Matheno

回答

8

invalidate_session选项security.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'))); 
} 

'security.logout.handler.session'代码:

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

....

+0

很明显,这是有效的,我现在接受你的答案,因为我需要做更多的测试,但如果我有任何问题,我会回来,谢谢 – ReynierPM