Symfony2访问控制不起作用

时间:2014-03-13 19:54:06

标签: php symfony

在我的访问控制中,我有一堆规则,但它们似乎都没有工作。我属于一个没有角色的团队,我仍然可以访问所有路线。我尝试在路径的末尾添加美元符号,但这不起作用。我也尝试重新排序路径,但也失败了。任何建议都会有所帮助!

这是我的security.yml文件

security:
    encoders:
        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

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:       true
            anonymous:    true

    access_control:
        - { path: ^/system/staff/add, roles: ROLE_ADD_STAFF }
        - { path: ^/system/staff/edit, roles: ROLE_EDIT_STAFF }
        - { path: ^/system/staff, roles: ROLE_VIEW_STAFF }

        - { path: ^/system/profile/edit, roles: ROLE_USER }
        - { path: ^/system/profile, roles: ROLE_USER }

        - { path: ^/system/officer/add, roles: ROLE_ADD_OFFICER }
        - { path: ^/system/officer/edit, roles: ROLE_EDIT_OFFICER }
        - { path: ^/system/officer, roles: ROLE_VIEW_OFFICER }

        - { path: ^/system/job/add, roles: ROLE_ADD_JOBS }
        - { path: ^/system/job/edit, roles: ROLE_EDIT_JOBS }
        - { path: ^/system/job, roles: ROLE_VIEW_JOBS }

        - { path: ^/system/company/add, roles: ROLE_ADD_COMPANIES }
        - { path: ^/system/company/edit, roles: ROLE_EDIT_COMPANIES }
        - { path: ^/system/company, role: ROLE_VIEW_COMPANIES }

        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/system, roles: ROLE_USER }

例如我当前的群组没有ROLE_EDIT_STAFF角色,但我仍然可以访问该路径。

1 个答案:

答案 0 :(得分:3)

每次发出请求时,symfony都会检查您的访问控制以找到有效的访问控制。

当您请求/system/staff/edit时,会发生什么。

对于您的设置,它会找到:

- { path: ^/system/staff/edit, roles: ROLE_EDIT_STAFF }

但是因为你没有角色ROLE_EDIT_STAFF,所以它继续前进。

现在匹配:

- { path: ^/system/staff, roles: ROLE_VIEW_STAFF }

因为您的路线确实以^ / system / staff开头。您拥有ROLE_VIEW_STAFF,因此您可以获得访问权限。

除此之外你还有:

- { path: ^/system, roles: ROLE_USER }

这意味着拥有ROLE_USER的任何人都可以访问以/system开头的任何路线。

/system/admin/delete-all/system是否与它们相匹配。

如果你想使用严格的路由控制,我建议你从路由的开头删除^,除非你真的想要匹配从^后面开始的任何路由。