[英]Symfony2 - 2 firewalls, 1 login
问题:我想在我的Symfony2网站上创建一个管理部分,该部分仅供具有ROLE_ADMIN的用户使用
我不知道是否应该创建新防火墙或使用访问控制。 我试图一起做这两个,但管理员部分仍然可供所有用户访问。
目前,所有网站都在安全区域防火墙下,我希望匿名的页面可以通过访问控制释放。
这是我的security.yml
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
my_facebook_provider:
id: my_user.facebook_provider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/login$
security: false
context: login
admin:
pattern: /admin/
form_login:
provider: fos_userbundle
check_path: /login_check
login_path: /login
anonymous: ~
secured_area:
pattern: ^/
anonymous: ~
form_login:
login_path: /login
check_path: /login_check
default_target_path: tk_group_homepage
provider: fos_userbundle
remember_me: true
csrf_provider: form.csrf_provider
remember_me:
key: %secret%
lifetime: 31536000 # 365 days in seconds
fos_facebook:
app_url: "%api_facebook_name%"
server_url: "%api_facebook_server%"
check_path: /login_facebook_check
default_target_path: tk_user_homepage
provider: my_facebook_provider
logout:
path: fos_user_security_logout
target: fos_user_security_login
invalidate_session: false
context: login
access_control:
- { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/new, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/invitation, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/(subscribe|about|blog|press|contact), role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: IS_AUTHENTICATED_REMEMBERED }
- { path: ^/admin/, role: ROLE_ADMIN }
我也在考虑在控制器中检查用户是否具有管理员角色,如果没有则抛出异常,因为我的管理部分当前只有一个页面。 但我不知道这是否是最佳实践,如果我想扩展我的管理部分,这可能是一个问题。
我不想创建一个新的用户提供商,因为我们只有2个管理员。
非常感谢,Jules
您应该删除admin
防火墙并依赖access_control
; 如果您在/admin/
URL下有管理员登录表单,您当然在登录前将无法看到它,因此您应该使用/login
表单以admin身份登录,或者修改您的access_control:
- { path: ^/admin/login/, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
这是官方文件说的关于你的情况:
- 多个防火墙不共享安全上下文如果您使用多个防火墙并对一个防火墙进行身份验证,则不会自动对任何其他防火墙进行身份验证。 不同的防火墙就像不同的安全系统。 为此,您必须为不同的防火墙明确指定相同的防火墙上下文。 但通常对于大多数应用程序,拥有一个主防火墙就足够了。
http://symfony.com/doc/current/book/security.html#book-security-common-pitfalls
你应该阅读整个Common pitfalls
部分
如果您真的想要使用不同的防火墙 ,只需按照文档说明,并在它们之间共享相同的防火墙上下文。 文档中也对此进行了描述: http : //symfony.com/doc/current/reference/configuration/security.html#reference-security-firewall-context
这是一个简单的例子:
admin:
(... other options ...)
context: my_security_context
secured_area:
context: my_security_context
(... other options ...)
访问控制查找第一个匹配项 。
因此你需要把这一行:
- { path: ^/admin/, role: ROLE_ADMIN }
在此之前:
- { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
如果你不这样做,/ admin /无论匹配路径^ / $并且不需要ROLE_ADMIN。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.