簡體   English   中英

Symfony2防火牆無法阻止訪問

[英]Symfony2 Firewall not preventing access

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

我已經正確安裝和配置了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角色,我想防止他們訪問url / dashboard。

這是我的防火牆:

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]}

即使沒有連接並且我也不想訪問,也可以訪問頁面/ dashboard。 我怎么了?

從那個pastebin

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

這行是導致您的問題的原因。 這告訴symfony2安全系統,每個用戶都可以訪問所有內容(如果忽略FOS,這就是“非常重要的規則”),因此,一旦滿足,就不會再進行其他控制(如- { path: ^/OSC/dashboard, role: ROLE_USER}

可能的解決方案:

1)將那條線放在ACL的底部。

PRO :您的應用程序可以工作
缺點 :如果未正確設置所有ACL,則會遇到“安全性”問題,或者某些未經授權的用戶可以訪問根據您的邏輯無法訪問的頁面。

2)完全刪除該行

PRO :您的應用程序不會遭受安全性問題和未經授權的訪問
缺點 :您必須明確且正確地設置所有路由,但是如果您要構建一個強大的應用程序,這是非常“自然的”

你通過得到的原因是因為沒有一個防火牆/dashboard ,但(假設你想設置SonataAdminBundle ),這不是你應該有什么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 (. /OSC(.*)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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