2015-09-26 61 views
3

是否有人知道Symfony認證非常好?Symfony2 SessionUnavailable異常

因爲每次嘗試在啓動後使用新瀏覽器登錄時,我都會收到SessionUnavailable Exception文本「沒有會話可用,它超時或Cookie未啓用」。爲什麼我在啓動後使用新的瀏覽器時沒有進行新的會話?

我挖得更深一點,在vendor/symfony/symfony/src/Symfony/Component/Security/HTTP/Firewall/AbstractAuthenticationListener.php中找到一個設置爲true的選項「require_previous_session」,但我沒有如果不知道它實際做了什麼,該如何將它設置爲假。

任何提示將是偉大的。

的Security.yml文件是相當大的,因爲角色系統,但這裏看看: Security.yml

+1

難道您發佈security.yml文件,看你怎麼配置呢? – angelwally

回答

5

require_previous_session設置有點斜,但可以(希望)與一些代碼來解釋。

所以ordinarilly,當你建立了一個標準的形式登錄(如the docs),在你的security.yml文件設置您的防火牆具有圖案(比如/user),並設置anonymous選項。現在,在您訪問控制下來,你設定的登錄頁面(比如/user/login)擁有的IS_AUTHENTICATED_ANONYMOUSLY的作用,就像這樣:

firewalls: 
    default: 
     pattern: ^/user 
     anonymous: ~ 
     form_login: 
      login_path: /user/login 
      check_path: /user/login_check 

access_control: 
    - { path: ^/user/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/user, roles: ROLE_USER } 

現在,當有人去/user是他們獲得轉發​​到/user/login會發生什麼; 他們這樣做時,他們將爲他們創建一個會話(如果他們還沒有創建)並且他們的分配角色將是anon(您可以在/user/login上的Symfony工具欄中進行檢查),如上面的access_control部分所允許的。

這意味着無論何時有人登錄(即將憑據發送至/user/login_check),他們將已經爲他們創建會話,而require_previous_session將爲true。

對於大多數人來說,這很好,你不必擔心這個設置。但是,如果您開始觸摸安全組件的邊緣,例如創建自己的身份驗證提供程序或禁用安全性(特定模式的security: false,請參閱默認的dev防火牆以查看相關示例),那麼您可能會遇到這種情況問題。

據我所知,在登錄之前沒有會話沒有安全處罰 - 我有生產站點在這種情況下進行。但是,您可以在登錄表單上使用CSRF令牌(cookbook entry)以獲得額外的安全性,這意味着對用戶帳戶的攻擊要困難得多。

短版本:如果解決了您的問題,我不擔心設置該選項。根據您的網站規模,這樣做可能會帶來性能上的提升(如果您可以登錄整個網站,但未經身份驗證的用戶不需要會話),但是安全方面,您應該很好。

編輯,例如從上面require_previous_session設置爲false:

firewalls: 
    default: 
     pattern: ^/user 
     anonymous: ~ 
     form_login: 
      login_path: /user/login 
      check_path: /user/login_check 
      require_previous_session: false 
+0

好的,所以require_previous_session可以是假的沒有傷害?我可以在一些配置文件中做到嗎?因爲在其中一個供應商文件夾中執行它不會被升級到github。 –

+0

我用一個例子編輯了我的答案。您還應該檢查安全組件的[參考文檔](http://symfony.com/doc/current/reference/configuration/security.html)。 –

+0

@JohnNoel感謝您的詳細解釋! +1。另外,找出把'require_previous_session'全部放入安全配置的原因是很好的......是否有能力做CSRF驗證的唯一原因? –