我正在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 }
但是我找不到如何将管理员用户限制在这些页面上。实现这一目标的最佳方法是什么?
答案 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