我正在为客户端做一个简单的CMS,我遇到了Symfony 2实现安全的防火墙问题。我设置了2个bundle - CMSBundle和AdminPanelBundle -第一个用于前端,第二个用于管理面板。我通过客户提供程序(实现UserProviderInterface)通过数据库连接到表用户,并在列中使用角色ROLE_USER和ROLE_ADMIN,为用户实现了安全性。
bundle中的每个登录都可以通过/login和/admin/login单独工作,但我想做的是让它们一起工作,所以如果用户有ROLE_ADMIN,他们可以看到前端和管理面板,如果ROLE_USER只有前端。因此,如果用户以正确的角色登录任何一个bundle,就会看到正确的内容。我的安全配置如下:
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,它工作得很好,但它给了我访问拒绝/帐户/前端。/admin/帐户在管理面板中工作正常。我也试图有/帐户/完全安全,而网站的其余部分是可用的,但如果用户登录他们的信息应该通过"app.user"键在Twig模板中看到。我试图只设置/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(与一个设计)和用户通过前端/登录与前端设计。现在有了这个设置/帐户给我访问拒绝,当我试图访问/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
和其他所有内容将对每个访问者可用(无论是否经过身份验证,都无关紧要)。
编辑:
我忘了提到:您只需要一个防火墙(/
模式),否则此解决方案将不起作用。