0

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

我想阻止人们在没有登录的情况下访问 url /dashboard,因此如果他们没有角色 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]}

即使我没有连接并且我不希望那样,我也可以访问页面/仪表板。我怎么了?

4

2 回答 2

2

从那个pastebin

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

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

可能的解决方案:

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

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

2)完全删除该行

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

于 2013-05-28T19:45:30.620 回答
-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(.*)

于 2013-05-21T03:04:07.757 回答