我正在为客户端做一个简单的CMS,我遇到了Symfony 2安全性实施的防火墙问题。我已经设置了2个捆绑包 - CMSBundle和AdminPanelBundle - 第一个用于前端,第二个用于管理面板。我已经通过客户端提供程序(实现UserProviderInterface)为用户实现了安全性,通过db连接到一个列中具有角色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 /完全安全,而网站的其余部分可用但如果用户登录他们的信息应该通过" app.user"在Twig模板中输入密钥。我试图只创建/ account / firewalled,但后来我丢失了网站其余部分的安全上下文。这似乎是一个简单的场景,但遗憾的是它并不起作用。有没有人尝试过这样的事情来指出我做错了什么?
我还尝试了以下内容:
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(使用一种设计)和用户通过前端/登录和前端设计登录。现在有这个设置/帐户给我访问拒绝,当我尝试访问/管理员而不登录它带我到/登录,而不是/ admin /登录这是奇怪的。
答案 0 :(得分:1)
如果我误解了你的意图,请纠正我......
我认为您可以将防火墙pattern
设置为仅/
,并使用access_control
按钮security.yml
来设置细粒度权限:
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
网址。另一方面,每个访问者都可以使用/login
和其他所有内容(已验证或未通过,无关紧要)。
希望这会有所帮助......
我忘了提到:您需要只有一个防火墙(/
模式),否则此解决方案将无效。