FOSUserBundle使用多个字段对用户进行身份验证

时间:2014-07-25 14:24:35

标签: symfony fosuserbundle

我尝试基于3个字段(字符串,布尔值和电子邮件)实现用户身份验证。在Symfony2和Fos文档之后,我开始创建一个自定义用户提供程序,但似乎我必须在较低级别实现的接口(UserProviderInterface)需要" loadUserByUsername"方法。

我的问题是:哪个是实现多个字段登录的最佳方式? 非常感谢你!

2 个答案:

答案 0 :(得分:0)

假设您使用的是FOSUserBundle并且您没有使用username字段,我认为更简单的方法是“撰写”您的3个字段并将其用作username

要做到这一点,你需要:

  • 自定义登录表单。隐藏用户名字段并添加3。
  • 创建一个kernel.request侦听器,读取您的3个字段,并将username字段添加到request对象。完成此操作后,您处于“正常”流程

假设我有这些数据:

  • me@mymail.com
  • MyRandomString
  • 1< - 这是你的booleand值

在数据库中,username my@mymail.com|MyRandomString|1namespace My\AwesomeBundle\Listener; use Symfony\Component\HttpKernel\Event\GetResponseEvent; class MyLoginFieldFormatterListener { public function onKernelRequest(GetResponseEvent $event) { // This is you request object. // http://api.symfony.com/2.5/Symfony/Component/HttpFoundation/Request.html $request = $event->getRequest(); // Add a condition to execute code only when route login data are submitted is required if ($request->get('_route') != 'fos_user_security_check') return; // You can access POST values via `request` property $yourField1 = $request->request->get('yourField1'); // Get the other fields and compose your username // The field name MUST be _username as long as you didn't overwrite it in the conf $request->request->set('_username', $yourComposedUsername); } } (您可以根据需要撰写用户名)

以下是侦听器的示例

我\ PersonBundle \监听\ MyLoginFieldFormatterListener

services:
  listener.compose_username_listener:
    class: My\PersonBundle\Listener\MyLoginFieldFormatterListener
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 255 }

配置

services.yml

priority

不要忘记{{1}}所以这个侦听器是第一个被执行的。

答案 1 :(得分:0)

@Hpatoio谢谢你,你的解决方案完美无缺:)只有一个必须修复的细节:监听器优先级必须设置为31

根据文档(http://symfony.com/doc/current/reference/dic_tags.html#kernel-request),RouteListener优先级为32

自定义侦听器必须在RouteListener之后执行(以获得正确的路由信息​​)并在验证系统之前执行

所以正确的配置是:

services:
  listener.compose_username_listener:
    class: My\PersonBundle\Listener\MyLoginFieldFormatterListener
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 31 }