通过来自多个提供商的用户名查找用户 [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');
我需要根据用户名或电子邮件地址在 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');