Symfony2 ACL - 无法在单个提供程序上设置多个用户来源

时间:2012-11-18 16:47:44

标签: symfony acl provider

我正在试图找出为什么我无法将多个用户提供程序设置为单个提供程序。 目前我正在配置ACL。对于用户提供商,我希望有几个“硬编码”用户和用户从数据库加载。

阅读documentation表示您不需要拥有两个用户提供商 - 一个用于in_memory个用户,另一个用于database个用户。您应该能够将它们组合到单个用户提供程序中(这正是我要做的)。

建议的配置是:

security:
    providers:
        main_provider:
            memory:
                users:
                    foo: { password: test }
            entity:
                class: Acme\UserBundle\Entity\User,
                property: username

我的配置是:

security:
    providers:
        main_provider:
            memory:
                users:
                    foo: { password: test }
            entity:
                class: Company\EntitiesBundle\Entity\User,
                property: username

不幸的是我得到了这个例外:

InvalidConfigurationException: Invalid configuration for path "security.providers.main_provider": You cannot set multiple provider types for the same provider

但是,如果我设置两个不同的提供程序并将它们链接起来,那么它可以正常工作。 我无法弄清楚为什么会这样?文档中明确说明了这一点 - you can accomplish this even more easily by combining the two sources into a single provider 我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

为什么不连接供应商?您所引用的文档声明您可以使用多个用户提供程序“ ...通过创建将两者链接在一起的新提供程序”。

http://symfony.com/doc/current/book/security.html#using-multiple-user-providers

每种身份验证机制(例如HTTP身份验证,表单登录等)只使用一个用户提供程序,默认情况下将使用第一个声明的用户提供程序。但是,如果您想通过配置和数据库中的其他用户指定 少数用户,该怎么办?这可以通过创建一个将两者链接在一起的新提供商来实现。

现在,所有身份验证机制都将使用 chain_provider,,因为它是第一个指定的。反过来, chain_provider 将尝试从 in_memory user_db 提供程序加载用户。

您所要做的就是建立一个连锁提供商。

# app/config/security.yml
security:
    providers:
        main_provider:
            chain:
                providers: [memory_provider, entity_provider]
        memory_provider:
            memory:
                users:
                    foo: { password: test }
        entity_provider:
            entity:
                class: Company\EntitiesBundle\Entity\User
                property: username

答案 1 :(得分:-2)

您使用的是哪个Symfony版本?如果2.0,在2.0文档中配置略有不同:

# app/config/security.yml
security:
    providers:
        main_provider:
            users:
                foo: { password: test }
            entity: { class: Acme\UserBundle\Entity\User, property: username }

请注意memory密钥丢失。