Php 限制管理员访问Symfony2中的url模式

Php 限制管理员访问Symfony2中的url模式,php,security,symfony,Php,Security,Symfony,我正在Symfony2中开发一个小型后台办公室,我希望被授予角色\u ADMIN的用户只能使用^/ADMIN/URL模式访问页面(以及^/logout$) 到目前为止,我已设法限制其他用户使用访问控制访问这些页面: // security.yml firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false secured_area:

我正在Symfony2中开发一个小型后台办公室,我希望被授予
角色\u 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 }
但我找不到如何限制管理员用户访问这些页面。实现这一目标的最佳方式是什么?

使用以下表格:

access_control:
    - { path: ^/admin, roles: ROLE_ADMIN }
有关更多信息,请单击以下链接-

使用此表单:

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

有关更多信息,请单击以下链接-

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

role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN
这意味着,无论角色用户请求什么,角色管理员都可以访问。如果删除该层次结构,则管理员可以访问用户页面


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

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

role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN
这意味着,无论角色用户请求什么,角色管理员都可以访问。如果删除该层次结构,则管理员可以访问用户页面


我建议的选择是简单地创建一个新角色,比如
role\u MANAGER
,它只能访问
^/admin/
URL,这将更适合您的情况。

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


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

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


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

我已经这样做了,以防止非管理员用户访问
^/admin/
URL。我试图做的是阻止管理员用户访问其余部分。@Jukurrupa如果您不希望管理员用户访问应用程序的其余部分,那么他们就不是真正的管理员。我已经这样做了,以阻止非管理员用户访问
^/admin/
URL。我试图做的是阻止管理员用户访问其余部分。@Jukurrupa如果您不希望管理员用户访问应用程序的其余部分,那么他们不是真正的管理员。站点的其余部分是否也为普通用户提供了密码保护?只是管理员有额外的权限,还是你说如果他们登录,就不能访问公共页面?我添加了我的
security.yml
文件的其余部分。基本上,所有内容都禁止未登录的用户使用,普通用户可以访问除
/admin
页面以外的所有内容。站点的其余部分也为普通用户提供密码保护吗?只是管理员有额外的权限,还是你说如果他们登录,就不能访问公共页面?我添加了我的
security.yml
文件的其余部分。基本上,所有内容都禁止非登录用户使用,普通用户可以访问除
/admin
页面以外的所有内容。创建新角色听起来是最好的解决方案。但是,我将
^/admin/
访问控制规则更改为
角色管理者
,并授予我的前任管理员
角色管理者
状态,它仍然可以访问其他页面(我使用控制台将其从
角色管理
降级并重新登录)。我还建议将模式^/admin/更改为类似^/manage/的模式,以保持一致性。另外要小心,你希望你的管理员同时也是一个管理员和用户。据我所知,每个登录的人都有一个角色
role\u user
,因此你的
role\u manager
将有一个
role\u user
,这样你就能看到一切。要确保
角色\u管理器
只能看到特定目录,您需要将另一个允许的角色设置为
^/
。您可能需要有一个转发页面作为登录目的地,该登录目的地具有要转发的
ROLE\u USER