【问题标题】:Restricting admin access to url pattern in Symfony2限制管理员对 Symfony2 中 url 模式的访问
【发布时间】:2013-09-20 14:22:27
【问题描述】:

我正在 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 }

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

【问题讨论】:

  • 对于普通用户,网站的其余密码是否也受到保护?仅仅是管理员拥有额外的权限,还是您说如果他们已登录,他们应该无法访问公共页面?
  • 我添加了 security.yml 文件的其余部分。基本上所有内容都禁止非登录用户访问,普通用户可以访问除/admin 页面之外的所有内容。

标签: php security symfony


【解决方案1】:

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

role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

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

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

【讨论】:

  • 创建一个新角色听起来是最好的解决方案。但是,我将^/admin/ 访问控制规则更改为ROLE_MANAGER,并授予我的前管理员ROLE_MANAGER 状态,它仍然能够访问其他页面(我使用控制台将其从ROLE_ADMIN 降级并重新登录)。
  • 我还建议将模式 ^/admin/ 更改为类似于 ^/manage/ 的模式,以保持一致。还要小心,您希望您的管理员既是经理又是用户。
  • 据我所知,登录的每个人都有ROLE_USER 的角色,所以你的ROLE_MANAGER 将拥有ROLE_USER,所以将能够看到所有内容。为确保ROLE_MANAGER 只能看到该特定目录,您需要为^/ 设置另一个允许的角色。您可能需要一个转发页面作为登录目标,该页面具有ROLE_USER,它将用户转发到他们指定的目录......或者创建一个身份验证侦听器。
  • ROLE_MANAGER 是不是ROLE_USER 无所谓,只要ROLE_MANAGER 是唯一可以访问^/manage 部分的人就可以了
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    使用这个表格:

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

    欲了解更多信息,请点击以下链接 - http://symfony.com/doc/current/book/security.html

    【讨论】:

    • 我已经这样做了,以防止非管理员用户访问^/admin/ URL。我试图做的是阻止管理员用户访问其余部分。
    • @Jukurrupa 如果您不希望管理员用户访问应用程序的其余部分,那么他们就不是真正的管理员。
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2019-08-11
    • 2011-03-15
    相关资源
    最近更新 更多