5

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

所有经过身份验证的用户和管理员都需要可以访问图像和文件,而不管提供者是谁。它们通过一个控制器提供服务,该控制器提供更细粒度的访问控制。

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

这是我们当前 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: /
4

2 回答 2

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 

您可以在此处查看文档:

  1. 使用多个用户提供程序

问候, 马特

于 2012-09-06T20:13:12.780 回答
1

我对这个问题有一些经验,解决方案是马特写的那个。

但是,由于应用程序具有管理、学生和教师防火墙,我无法在需要时成功模拟。也就是说,来自管理部门的用户可以模拟来自他们的防火墙的用户,并且仅限于那些用户。

现在,我可能做错了什么,但因为这是一个时间敏感的任务,我们决定把所有的东西都放在单一的防火墙后面,让不同的角色来完成这项工作。结果证明这是一个更简单的解决方案,但最终取决于您...

于 2012-10-09T21:30:26.807 回答