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

时间:2015-04-23 12:22:05

标签: symfony symfony-2.6 symfony-2.7

我需要根据用户名或emailadres在symfony2中找到一个用户对象。这不适用于登录,但适用于用户的其他操作。

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

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

有没有办法按用户名查找用户,就像Symfony2本身登录时使用的一样? 这样,无论在security.yml中如何配置用户提供程序,它都将起作用。

我可以在Symfony2中使用一些服务吗? 是否有“用户提供商服务”,我可以调用类似“loadUserByUsername”的方法来尝试每个配置的提供商?

2 个答案:

答案 0 :(得分:1)

在探索了Symfony的SecurityBundle后,我想出了以下内容:

鉴于这是在你的security.yml:

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

Symfony将使用以下名称创建服务:

security.user.provider.concrete.administrationuser

此服务使用UserProviderInterface,当您获取此服务时,您只需调用方法loadUserByName并找到您的用户。

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

我处于更通用的情况,所以我在我的bundle的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类中配置,但这是另一回事。

现在我可以简单地使用新的别名,我将获得正确的服务,以便在控制器中找到我的用户,如下所示:

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

答案 1 :(得分:0)