【问题标题】:find user by username from multiple providers [symfony2]通过多个提供商的用户名查找用户 [symfony2]
【发布时间】:2015-04-23 12:22:05
【问题描述】:

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

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

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

有没有办法像 Symfony2 本身在登录时使用的那样通过用户名查找用户? 这样,无论在 security.yml 中如何配置用户提供程序,它都可以工作。

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

【问题讨论】:

    标签: symfony symfony-2.6 symfony-2.7


    【解决方案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 类中进行配置,但这是另一回事。

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

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 这就是您配置用户提供程序的方式。问题是当我只有一个用户名时如何使用该配置来查找用户。
      • 您想使用您的用户名的提供者来查找用户登录是吗?
      • 我有一个用户名并想获取用户对象。由于已经在 security.yml 中配置了用户提供程序,因此使用该信息是有意义的。但我找不到任何允许我这样做的默认 symfony 服务。
      • 我认为提到“多个”会让你走错方向。我发布了解决方案作为答案。在处理多个用户提供者时,您也可以使用链提供者。我正在寻找一种通用的方式来获取用户。
      猜你喜欢
      • 2018-09-25
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2014-05-05
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多