2013-05-21 233 views
0

我想我並不完全理解symfony的防火牆和訪問控制的概念,但這裏是我的理解。Symfony2防火牆不阻止訪問

我已經安裝並正確配置了FOSUserBundle。

我創造了一些角色:

role_hierarchy: 
    ROLE_COACH:   [ROLE_USER] 
    ROLE_EDITOR:   [ROLE_USER] 
    ROLE_PREMIUM_COACH : [ROLE_USER, ROLE_COACH] 
    ROLE_ADMIN:   [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_COACH, ROLE_EDITOR, ROLE_PREMIUM_COACH] 
    ROLE_SUPER_ADMIN:  [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

我想阻止其他人訪問該網址/儀表板,如果他們還沒有登錄,因此,如果他們沒有作用ROLE_USER。

這裏是我的防火牆:

firewalls: 
    # -> custom firewall for the admin area of the URL 
    admin: 
     pattern:  /admin(.*) 
     form_login: 
      provider:  fos_userbundle 
      login_path:  /admin/login 
      use_forward: false 
      check_path:  /admin/login_check 
      failure_path: null 
     logout: 
      path:   /admin/logout 
     anonymous: true 
    # -> end custom configuration 

    # defaut login area for standard users 
    main: 
     pattern:  .* 
     form_login: 
      provider:  fos_userbundle 
      csrf_provider: form.csrf_provider 
      login_path:  /login 
      use_forward: false 
      check_path:  /login_check 
      failure_path: null 
     logout:  true 
     anonymous: true 

這是我下ACCESS_CONTROL補充說:

- { path: ^/dashboard, role: [ROLE_USER]} 
    - { path: ^/dashboard/blog, role: [ROLE_EDITOR]} 

我可以訪問網頁/儀表板即使我沒有連接,我不希望出現這種情況可能。我錯了什麼?

+0

匿名:真的是罪魁禍首 –

+0

我應該怎麼辦呢?當你指定一條路線必須有一個角色時,是不是假設被覆蓋? – CoachNono

+0

嘗試爲您的儀表板創建另一個防火牆。 –

回答

2

從這個pastebin

- { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 

這條線是什麼導致你的問題。這告訴給Symfony2的安全系統,每個用戶都可以訪問的一切(這是「第一個規則:」如果你忽視了FOS的),因此,當這satified,沒有其他的控制研究將完成(如- { path: ^/OSC/dashboard, role: ROLE_USER}來了以後)

Possibile解決方案:

1)將該行放在您的acl底部。

PRO:您的申請將工作
缺點:如果你沒有正確設置ACL的所有,你會碰到的「安全」問題,或者一些未經授權的用戶可以訪問的頁面,進入你的邏輯,他們沒有訪問。

2)刪除該行所有

PRO:您的應用程序將不會從安全問題和未經授權的訪問
缺點遭受:你必須明確並正確設置所有的路線,但是這是很「自然」,如果你想建立一個強大的應用程序

+0

你真了不起,謝謝!我會使用第二個選項! – CoachNono

+0

@ CoachNono:不客氣 – DonCallisto

-1

你通過得到的原因是因爲沒有對/dashboard防火牆,但(假設你想設置),這不是你應該做的有access_control

這裏是如何我尋找Sonata

access_control: 
    - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/login-check$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin, role: ROLE_ADMIN } 

    - { path: ^/.*, role: [IS_AUTHENTICATED_ANONYMOUSLY] } 

否則你的防火牆定義是好的。

如果你想配置你自己定製的儀表板,那麼你需要定義另一個防火牆進入,非常類似於admin防火牆。

編輯

嘗試改變模式:^/.*

如果你想阻止只是/OSC則:/OSC(.*)

+1

有一個用於/儀表板的防火牆,在OP問題 – DonCallisto

+0

對不起,我錯過了,編輯過的文章 –