[英]Symfony 2 firewalls - front end and admin panel with the same user
我正在为客户端执行一个简单的CMS,并且遇到了Symfony 2安全实现的防火墙问题。 我设置了2个包-CMSBundle和AdminPanelBundle-第一个用于前端,第二个用于管理面板。 我已经通过客户提供程序(实现UserProviderInterface)通过数据库连接到具有列ROLE_USER和ROLE_ADMIN角色的表用户的数据库来实现用户的安全性。
捆绑中的每个登录都可以分别通过/ login和/ admin / login正常运行,但是我想做的是让它们一起工作,因此,如果用户具有ROLE_ADMIN,则他们可以看到前端和管理面板(如果仅ROLE_USER)前端。 因此,如果登录到任一捆绑软件,则具有正确角色的用户将看到正确的内容。 我的安全性配置如下:
security:
firewalls:
user_login:
pattern: /login$
security: false
user_area:
pattern: /
anonymous: ~
form_login:
login_path: /login
check_path: /login_check
logout:
path: /logout
target: /
remember_me:
key: "user_secret"
lifetime: 31536000
path: /account/
domain: ~
admin_login:
pattern: /admin/login$
security: false
admin_area:
pattern: /admin/
form_login:
login_path: /admin/login
check_path: /admin/login_check
logout:
path: /admin/logout
target: /admin/
remember_me:
key: "admin_secret"
lifetime: 31536000
path: /admin/
domain: ~
access_control:
- { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /account/([a-z_]+)?, roles: ROLE_USER }
- { path: /admin/([a-z_]+)?, roles: ROLE_ADMIN }
当我登录/ login时,它可以正常工作,但它为前端提供了/ account /的“拒绝访问”功能。 / admin / account在管理面板中可以正常工作。 我还尝试使/ account /完全安全,同时使网站的其余部分可用,但是如果用户登录,则应该通过Twig模板中的“ app.user”键看到他们的信息。 我试图只对/ account /进行防火墙保护,但是随后我失去了该网站其余部分的安全性。 看来这是一个简单的场景,但是不幸的是它不起作用。 有没有人试图实现这样的东西来指出我做错了什么?
我也尝试了以下方法:
security:
firewalls:
user_area:
pattern: /
anonymous: ~
form_login:
login_path: /login
check_path: /login_check
logout:
path: /logout
target: /
remember_me:
key: "user_secret"
lifetime: 31536000
path: /account/
domain: ~
admin_area:
pattern: /admin/
form_login:
login_path: /admin/login
check_path: /admin/login_check
logout:
path: /admin/logout
target: /admin/
remember_me:
key: "admin_secret"
lifetime: 31536000
path: /admin/
domain: ~
access_control:
- { path: /account/([a-z_]+)?, roles: ROLE_USER }
- { path: /admin/([a-z_]+)?, roles: ROLE_ADMIN }
- { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /, roles: IS_AUTHENTICATED_ANONYMOUSLY }
仍然不起作用。 我需要两个不同的登录点,因为管理员将从/ admin / login(具有一种设计)登录,而用户则通过具有前端设计的前端/ login登录。 现在,通过此设置,/ account使我可以拒绝访问,当我尝试不登录而访问/ admin时,它将带我进入/ login,而不是/ admin / login,这很奇怪。
如果我误解了您的意图,请纠正我,但是...
我认为您可以将防火墙pattern
设置为/
并在security.yml
按钮上使用access_control
来设置细粒度权限:
access_control:
- { path: /account/([a-z_]+)?, roles: ROLE_USER }
- { path: /admin/([a-z_]+)?, roles: ROLE_ADMIN }
- { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /, roles: IS_AUTHENTICATED_ANONYMOUSLY }
从官方文档:
对于每个传入请求,Symfony2会检查每个access_control条目以找到与当前请求匹配的条目。 一旦找到匹配的access_control条目, 它就会停止-只有第一个匹配的access_control用于强制访问。
因此,这将保护您的/account
和/admin
URL。 另一方面, /login
和其他所有内容都将可供每个访问者使用(无论是否经过身份验证,都没有关系)。
希望这可以帮助...
我忘了提:您将只需要一个防火墙(带有/
模式),否则该解决方案将无法工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.