Symfony2防火墙不阻止访问

时间:2013-05-21 01:22:59

标签: php symfony

我想我并不完全理解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。

这是我的防火墙:

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

即使我没有连接也可以访问页面/仪表板,我不希望这样。我错了什么?

2 个答案:

答案 0 :(得分:2)

pastebin

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

此行是导致您的问题的原因。这告诉symfony2安全系统每个用户都可以访问所有内容(如果忽略FOS,这是“第一条规则”),因此,当满足时,不会进行任何其他控制(因为- { path: ^/OSC/dashboard, role: ROLE_USER}来了后)

Possibile解决方案:

1)将该行放在acl的底部。

PRO :您的应用程序将正常工作 缺点:如果您没有正确设置所有ACL,您将遇到“安全”问题,或者某些未经授权的用户可能会访问您的逻辑中无法访问的页面。

2)删除该行

PRO :您的应用程序不会受到安全问题和未经授权的访问的影响 缺点:您必须明确且正确地设置所有路线,但如果您想构建一个强大的应用程序,这非常“自然”

答案 1 :(得分:-1)

您接通的原因是因为/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(.*)