2015-01-05 179 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