我们有一个系统,管理员和标准用户由他们自己的单独的安全提供程序处理。这在管理页面中引起了问题,因为管理员无法访问主站点防火墙后面的任何文件或图像,除非它们也已登录到主站点。
不论提供者如何,所有经过身份验证的用户和管理员都必须可以访问图像和文件。它们通过提供更细粒度访问控制的 Controller 进行服务。
是否可以定义多个提供者以允许访问路由?
这是我们当前的security.yml的精简版本:
security:
providers:
admin_user_db:
entity: { class: OurAdminUserBundle:AdminUser, property: username }
site_user_db:
entity: { class: OurSiteUserBundle:SiteUser, property: username }
firewalls:
admin_login:
pattern: ^/admin/login$
security: false
site_user_login:
pattern: ^/login
security: false
file_route:
pattern: ^/file
anonymous: ~
### We need to allow this route only for authorized users from
### either admin_user_db or site_user_db providers
admin_secured_area:
pattern: ^/admin
http_basic: ~
provider: admin_user_db
form_login:
check_path: /admin/login_check
login_path: /admin/login
logout:
path: /admin/logout
target: /
site_secured_area:
pattern: .*
http_basic: ~
provider: site_user_db
form_login:
check_path: /check_login
login_path: /login
failure_path: /login
failure_forward: false
logout:
path: /logout
target: /
最佳答案
我猜您在寻找的是ChainProvider
。该提供程序将配置为按顺序使用您当前的两个提供程序。
链提供程序将首先尝试使用配置它的第一个提供程序对用户进行身份验证。如果成功,则对用户进行身份验证。如果失败,则链提供商将尝试下一个,依此类推,直到无法再尝试其他提供商为止。
我使用这种技术让用户通过表单登录或Facebook登录进行身份验证。我有两个提供程序,一个用于Facebook,一个用于表单。然后,在我的防火墙中,提供者是链提供者,然后,用户可以使用其凭据或Facebook帐户登录。
由于链提供程序是顺序的,因此我建议将最常使用的提供程序放在首位。
以下是从Symfony文档站点获取的配置示例:
security:
providers:
chain_provider:
chain:
providers: [in_memory, user_db]
in_memory:
users:
foo: { password: test }
user_db:
entity: { class: Acme\UserBundle\Entity\User, property: username
您可以在这里查看文档:
问候,
马特
关于Symfony 2 : Accessing a firewalled route with two separate providers,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12299513/