2017-08-01 84 views
0

我使用symfony 2.8並且有時與身份驗證有問題。 問題是成功登錄重定向後會話丟失。小時弄清楚後,我心中已經發現了一些:有2會話ID在餅乾symfony 2.8 - 會話失敗後成功登錄重定向(有2個會話ID在cookie中)

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 

我認爲,這是事業zhcon失敗

你能幫我登錄後重定向??! :(

enter image description here


編輯

我忘了說,當客戶端使用的域名

這是我的安全出現與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 } 
+0

你可以從你security.yml或config.yml發佈安全層的配置?有可能配置了2個防火牆,並且重定向url匹配不同防火牆的模式,而不是授權登錄的那個1。 –

+0

是的,當然我編輯了我的答案 –

+0

你在哪裏存儲會話? –

回答

0

你的安全配置看起來不錯,但你存儲你r數據庫中的會話。 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語句的第二部分,僅在登錄時強制會話寫入。如果保留該部分,請將security_check_route替換爲安全檢查路由的名稱。如果您想在每個路線上返回之前強制進行會話寫入,請刪除該部分條件。

下面是聽者

<service id="response_listener" class="PathTo\ResponseListener"> 
    <tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" /> 
</service> 

希望這有助於配置的例子,

亞歷Cosoi