[英]symfony 2.8 - session lost after success login redirect ( there is 2 session id in cookie )
我正在使用symfony 2.8,有時會遇到身份驗證問題。 問題是成功登錄重定向后會話丟失。 幾個小時后,我發現了一些東西:Cookie中有2個會話ID
Header Value
accept-encoding gzip, deflate, sdch
accept-language en-US,en;q=0.8
cache-control max-age=0
connection keep-alive
cookie PHPSESSID=lme2ce9uk749eklbpnveeuir93; PHPSESSID=601fefa02332bbd4bea06a9603a8b7d6
我認為,這是導致登錄后重定向失敗的原因
你可以幫幫我嗎 !?? :(
已編輯
我忘了說這個應用程序可以與IP正常工作,當客戶端使用域名時會出現此問題
這是我的安全
security:
encoders:
Proshut\UserBundle\Entity\User:
algorithm: bcrypt
access_decision_manager:
strategy: unanimous
providers:
office:
entity: { class: ProshutUserBundle:User }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
security:
pattern: ^/(login|signup|openid|reset)$
security: false
ajax:
pattern: ^/(report|account)/ajax$
security: false
webservice:
pattern: ^/webservice(/[a-zA-Z]*)?$
security: false
captcha:
pattern: ^/generate/gcb_captcha$
security: false
office_area:
pattern: ^/
simple_form:
provider: office
authenticator: user.listener.authenticator
check_path: /login_check
login_path: /login
default_target_path: /dashboard
use_referer: true
username_parameter: form[_username]
password_parameter: form[_password]
failure_handler: user.listener.authentication.handler
success_handler: user.listener.authentication.handler
logout:
path: /logout
target: /login
http_basic: ~
access_control:
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
您的安全配置看起來還不錯,但是您將會話存儲在數據庫中。 sql會話的問題是競爭條件。 在將新值寫入會話表之前,您的處理程序將返回會話。 當您使用PHP-FPM時,symfony在發送響應后將調度kernel.terminate事件,以縮短響應時間,並在該事件中編寫會話。
解決此問題的方法是在將響應發送到客戶端之前強制保存會話,並可以在symfony中為響應事件創建偵聽器,如下所示:
class ResponseListener
{
public function onKernelResponse(FilterResponseEvent $event)
{
if ($event->isMasterRequest() && $event->getRequest()->get('_route') == 'security_check_route') {
$event->getRequest()->getSession()->save();
return;
}
}
}
在上面的示例中,我添加了if statemant的第二部分,以僅在登錄時強制會話寫入。 如果保留該部分,請用安全檢查路由的名稱替換security_check_route。 如果要在每條路徑上返回之前強制執行會話寫操作,請刪除條件部分。
以下是偵聽器的配置示例
<service id="response_listener" class="PathTo\ResponseListener">
<tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" />
</service>
希望這可以幫助,
亞歷山德魯·科索伊
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.