0

我正在 Symfony2 中开发一个小型后台,我希望被授予权限的用户ROLE_ADMIN只能访问带有^/admin/URL 模式的页面(以及^/logout$.

到目前为止,我已经设法限制其他用户使用访问控制访问这些页面:

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

    secured_area:
        pattern:    ^/
        anonymous:  ~
        form_login:
            provider:       fos_userbundle
            csrf_provider:  form.csrf_provider
            login_path:     /login
        logout:
            invalidate_session: false

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }
    - { path: ^/, role: ROLE_USER }

但我找不到如何将管理员用户限制在这些页面上。实现这一目标的最佳方法是什么?

4

3 回答 3

2

我认为您的问题是概念问题,而不是编程问题。根据定义,管理员可以访问所有页面,这就是管理员的职责。为了解决您的问题,您可以修改security.yml文件role_hierarchy中的:

role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

这意味着,无论 ROLE_USER 请求如何,ROLE_ADMIN 都可以访问。如果您删除该层次结构,您可能会让管理员无权访问用户页面。

我建议的选项是简单地创建一个新角色,比如ROLE_MANAGER只能访问^/admin/URL,这更适合您的情况。

于 2013-09-20T16:15:06.643 回答
2

您的问题很可能是 FOSUserBundle 中隐藏的小宝石。如果您以管理员身份登录,然后检查分析器,您将看到您的用户同时拥有 ROLE_ADMIN 和 ROLE_USER,这就是他们可以访问您的安全页面的原因。如果您查看 FOSUserBundle 的模型,您将在 User 类中看到,当您对用户调用 getRoles() 时,总是会在数组中添加一个默认角色。此常量在 UserInterface 类中设置为 ROLE_USER。

您可以探索许多解决方案,但可能最简单的方法就是为您的前端用户使用另一个角色。例如,如果您使用角色 ROLE_CUSTOMER,管理员用户将不会获得此角色,除非您在角色层次结构中明确定义它。这样,两组用户都将被限制在各自的部分。

于 2013-10-04T09:46:30.740 回答
0

使用此表格:

access_control:
    - { path: ^/admin, roles: ROLE_ADMIN }

有关更多信息,请单击以下链接 - http://symfony.com/doc/current/book/security.html

于 2013-09-20T14:28:22.473 回答