通过来自多个提供商的用户名查找用户 [symfony2]

find user by username from multiple providers [symfony2]

我需要根据用户名或电子邮件地址在 symfony2 中找到一个用户对象。这不是用于登录,而是用于对用户的其他操作。

我可以简单地请求 (Doctrine2) 存储库并从存储库上的 UserProviderInterface 调用方法 loadByUsername-class.

但是需要执行此操作的代码将在多个项目中使用,我需要它更通用一些。用户 class/table 可能不同,或者用户可能来自完全不同类型的提供商。

有没有办法像 Symfony2 本身在登录时使用的那样通过用户名查找用户? 这样,无论 security.yml.

中的用户提供程序如何配置,它都可以正常工作

我可以使用 Symfony2 中的一些服务吗? 是否有 "user provider service" 可以调用类似 "loadUserByUsername" 的方法来尝试每个已配置的提供程序?

在深入了解 Symfony 本身的 SecurityBundle 之后,我发现了以下内容:

鉴于这在您的 security.yml:

providers:
    AdministrationUser:
        entity:
            class: AdministrationBundle\Entity\User

Symfony 将创建一个具有以下名称的服务:

security.user.provider.concrete.administrationuser

此服务使用 UserProviderInterface,当您获取此服务时,您可以简单地调用方法 loadUserByName 并找到您的用户。

所以您只需要知道您自己配置的提供程序的名称,您就可以确定服务名称并获取它。


我处于更一般的情况,所以我在我的包的 Extension-class 中为该服务添加了一个别名:

    // alias the user_provider mentioned
    $container->setAlias('my_security_bundle.user.provider', new Alias('security.user.provider.concrete.' . strtolower($config['user']['provider'])));

其中 $config['user']['provider'] 来自 config.yml(并且需要在您的 Configuration class 中进行配置,但这是另一回事.

现在我可以简单地使用那个新别名,我将获得正确的服务来在 Controller 中找到我的用户,如下所示:

    /** @var UserProviderInterface $userProvider */
    $userProvider = $this->get('my_security_bundle.user.provider');
    $user = $userProvider->loadUserByUsername('someone@somewhere.tld');