Symfony 2:使用两个独立的提供者访问防火墙路线

Kai*_*aja 5 url-routing symfony

我们有一个系统,管理员和标准用户由他们自己独立的安全提供商处理.这导致管理页面出现问题,因为管理员无法访问主站点防火墙后面的任何文件或图像,除非他们也登录到主站点.

无论提供商如何,所有经过身份验证的用户和管理员都需要可以访问这些图像和文件.它们通过控制器提供,该控制器提供更细粒度的访问控制.

是否可以定义多个提供商以允许访问路由?

这是我们当前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: /
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 5

我想你要找的是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 
Run Code Online (Sandbox Code Playgroud)

您可以在这里查看文档:

  1. 使用多个用户提供商

问候,马特