2013-08-23 30 views
6

我有一個管理區域,其中包含我們強制要求https://的登錄信息。如果用戶沒有登錄,那麼擊中路由/管理員應該重定向到登錄頁面,但是我得到了無盡的重定向循環。不知道什麼是錯的,這裏是security.yml:在Symfony2安全中重定向死亡環路

firewalls: 
     admin_login: 
      pattern: ^/admin/secured/login$ 
      security: false 

     admin_secured_area: 
      pattern: ^/admin 
      provider: entity_admin 
      form_login: 
       check_path: /admin/secured/login_check 
       login_path: /admin/secured/login 
       default_target_path: /admin 
      logout: 
       path: /admin/secured/logout 
       target:/

    access_control: 
     - { path: ^/admin/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

感謝您的幫助!

+1

您是否嘗試刪除admin_login?從你的防火牆部分? – ILikeTacos

+0

嗨根據文檔我需要admin_login允許匿名用戶訪問登錄表單。我試圖刪除,它仍然重定向。雖然謝謝! – Acyra

+0

請告訴重定向哪些頁面? –

回答

3

嗨所以這是關係到Symfony2的$request->isSecure()檢查SSL的網站時是下一個負載均衡器,也有一些在PHP不一致的文件頭名的方式。配置文件需要以下內容:

trusted_proxies: [10.0.0.0/8] 

它現在可以工作,但我不知道是否存在此設置的安全問題。

+1

作爲一個旁註,你需要確保你從代理轉發正確的頭。 Symfony會檢查'X_FORWARDED_PROTO' ='https','on','ssl'或'1'。你可以通過app.php或app_dev.php中的var_dump $ _SERVER來看到這個變量。 – DIMMSum

+0

Hi Decave,你能詳細說明你的評論嗎?我們需要什麼代碼才能確保代理的正確標題?謝謝! – Acyra

+1

您需要配置您的代理,以便如果它通過https從瀏覽器接收到請求,它會轉發一個$ _SERVER變量,指示它通過https接收到請求。 您是否熟悉代理如何工作?如果代理通過https接收到請求,它有時會通過http將該請求轉發給Web服務器。因此,Web服務器無法知道始發請求是否爲https,因此代理必須將'$ _SERVER'變量作爲參考轉發。 Symfony檢查的$ _SERVER變量是'X_FORWARDED_PROTO'。那有意義嗎? – DIMMSum

2

^/admin/secured/login_check應該通過匿名身份驗證,因爲用戶在最初調用該頁面時不會有角色,因此也是循環。

+0

嗨,感謝您的建議。我試過了,但仍然失敗。此外,在文檔中login_check上不需要匿名用戶,並且在不強制https時登錄可以正常工作。 (還是)感謝你的建議。我會繼續努力! – Acyra

4

後快速瀏覽一下我要說的是,這樣的事情下面應該是正確的:

firewalls: 
    admin_secured_area: 
     pattern: ^/admin 
     provider: entity_admin 
     form_login: 
      check_path: /admin/secured/login_check 
      login_path: /admin/secured/login 
      default_target_path: /admin 
     logout: 
      path: /admin/secured/logout 
      target:/

access_control: 
    - { path: ^/admin/secured/(login|login_check|logout)$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
    - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

無論如何,如果這沒有幫助,我建議檢查與內置分析器(選項卡中的重定向與路由匹配和日誌),把它放在重定向改變config_dev.yml到:

web_profiler: 
    toolbar: true 
    intercept_redirects: true 
+0

請求中的我的頭文件將HTTPS設置爲關閉,即使實際進行https ...問題是nginx配置不是symfony,intercept_redirects:true ...幫我找到它.. – Drmjo

6

無需在防火牆的一個「admin_login」一節。但它看起來像你忘了匿名參數..

firewalls:  
     admin_secured_area: 
      anonymous: ~ 
      pattern: ^/admin 
      provider: entity_admin 
      form_login: 
       check_path: /admin/secured/login_check 
       login_path: /admin/secured/login 
       default_target_path: /admin 
      logout: 
       path: /admin/secured/logout 
       target:/

    access_control: 
     - { path: ^/admin/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/admin, roles: ROLE_ADMIN, requires_channel: https } 

正如我在我的評論說,你設置登錄用戶ROLE_ADMIN角色?

編輯:你的路由狀態HTTPS通道也爲管理部分?

+0

嗨,再次感謝您的幫助。在路由中不需要設置https,因爲我們在access_control中設置了它。 – Acyra

+2

我有一個類似的問題,對我來說,在'admin_secured_area'中添加了'anonymous:~'。 –

2

刪除:

admin_login: 
      pattern: ^/admin/secured/login$ 
      security: false