8

我试图弄清楚为什么我不能将多个用户提供者设置为一个提供者。目前我正在配置 ACL。对于用户提供者,我希望有几个“硬编码”用户和将从数据库加载的用户。

阅读文档说明您不需要拥有两个用户提供程序 - 一个用于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
我在这里想念什么?

4

2 回答 2

3

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

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

每个身份验证机制(例如 HTTP 身份验证、表单登录等)只使用一个用户提供程序,并且默认使用第一个声明的用户提供程序。但是,如果您想 通过配置指定几个用户,而其余用户则在数据库中呢?这可以通过创建一个将两者链接在一起的新提供者来实现

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

您所要做的就是设置一个链提供者。

# app/config/security.yml
安全:
    提供者:
        main_provider:
            链:
                提供者:[memory_provider,entity_provider]
        memory_provider:
            记忆:
                用户:
                    富:{密码:测试}
        entity_provider:
            实体:
                类:公司\实体捆绑\实体\用户
                属性:用户名
于 2014-01-09T21:10:49.897 回答
-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缺少密钥。

于 2012-12-08T23:26:59.600 回答