簡體   English   中英

symfony 2.8-成功登錄重定向后會話丟失(cookie中有2個會話ID)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM