2013-09-29 76 views
0

問:我想在我的Symfony2的網站,將只提供給了用戶ROLE_ADMIN創建一個管理員的部分的Symfony2 - 2防火牆,1個登錄

我不知道我是否應該創建一個新的防火牆或使用acces控件。我試圖一起做這兩件事,但所有用戶仍然可以訪問管理員部分。

目前所有的網站都在安全區域的防火牆和我想要的匿名頁面被訪問控制釋放。

這裏是我的security.yml

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 
     my_facebook_provider: 
      id: my_user.facebook_provider 

    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

     login: 
      pattern: ^/login$ 
      security: false 
      context: login 

     admin: 
      pattern: /admin/ 
      form_login: 
       provider: fos_userbundle 
       check_path: /login_check 
       login_path: /login 
      anonymous: ~ 

     secured_area: 
      pattern: ^/ 
      anonymous: ~ 
      form_login: 
       login_path: /login 
       check_path: /login_check 
       default_target_path: tk_group_homepage 
       provider: fos_userbundle 
       remember_me: true 
       csrf_provider: form.csrf_provider 
      remember_me: 
       key: %secret% 
       lifetime: 31536000 # 365 days in seconds 
      fos_facebook: 
       app_url: "%api_facebook_name%" 
       server_url: "%api_facebook_server%" 
       check_path: /login_facebook_check 
       default_target_path: tk_user_homepage 
       provider: my_facebook_provider 
      logout: 
       path: fos_user_security_logout 
       target: fos_user_security_login 
       invalidate_session: false 
      context: login 

    access_control: 
     - { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/new, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/invitation, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/(subscribe|about|blog|press|contact), role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/, role: IS_AUTHENTICATED_REMEMBERED } 
     - { path: ^/admin/, role: ROLE_ADMIN } 

我還想着在控制器檢查是用戶具有管理員角色,如果沒有拋出異常,因爲我的管理部分只有一個頁面目前。但我不知道這是否是最佳做法,如果我想擴展我的管理部分,這可能會成爲問題。

我不想創建一個新的用戶提供者,因爲我們只有兩個管理員。

非常感謝你, 朱

回答

2

您應該刪除admin防火牆和依靠access_control;如果你有/admin/ URL下管理員的登錄表單,你當然會無法登錄前看到它,所以你應該要麼使用/login形式登錄的管理員,或修改您的ACCESS_CONTROL:

- { path: ^/admin/login/, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/, role: ROLE_ADMIN } 

這裏是官方的醫生說你的情況:如果您在使用多重防火牆

  1. 多個防火牆不共享安全上下文,你對一個防火牆認證,你會 不針對任何其他認證防火牆自動。 不同的防火牆就像不同的安全系統。要做到這一點 你必須爲不同的 防火牆明確指定相同的防火牆上下文。但通常對於大多數應用來說,只有一個主防火牆 就足夠了。

http://symfony.com/doc/current/book/security.html#book-security-common-pitfalls

你應該閱讀整個Common pitfalls部分

如果你真的很喜歡使用不同的防火牆,只是做的文檔狀態,並共享相同的防火牆環境在他們之間。這也是文檔中描述: http://symfony.com/doc/current/reference/configuration/security.html#reference-security-firewall-context

,這裏是一個簡單的例子:

admin: 
     (... other options ...) 
     context: my_security_context 

    secured_area: 
     context: my_security_context 
     (... other options ...) 
+0

感謝您的回答,但訪問控制不適用於我的情況,這是我的問題。放置 - {path:^/admin /,role:ROLE_ADMIN}不會阻止普通用戶訪問/ admin url。 –

+0

如果刪除尾部斜槓會發生什麼情況?所以把'^/admin /'改成'^/admin'? – adamziel

+0

它不會改變任何東西.. –

0

訪問控制將查找第一場比賽

正因爲如此,你需要把這個行:

- { path: ^/admin/, role: ROLE_ADMIN } 

這一行之前:

- { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY } 

如果不這樣做,/管理/不管路徑匹配^/$和不需要ROLE_ADMIN。

相關問題