在Symfony2中限制对URL模式的管理员访问

时间:2013-09-20 14:22:27

标签: php security symfony

我正在Symfony2中开发一个小型后台办公室,我希望获得ROLE_ADMIN授权的用户只能访问带有^/admin/网址格式的网页(以及^/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 }

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

3 个答案:

答案 0 :(得分:2)

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

role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

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

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

答案 1 :(得分:2)

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

您可以探索许多解决方案,但最简单的方法可能只是让您为前端用户使用其他角色。例如,如果您使用角色ROLE_CUSTOMER,除非您在角色层次结构中明确定义,否则admin用户将不会获得此角色。这样,两组用户将被限制在各自的部分。

答案 2 :(得分:0)

使用此表格:

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

有关详情,请点击以下链接 - http://symfony.com/doc/current/book/security.html