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

Symfony FOSUserBundle使用多个字段对用户进行身份验证,symfony,fosuserbundle,Symfony,Fosuserbundle,我正在尝试基于3个字段(字符串、布尔值和电子邮件)实现用户身份验证。在Symfony2和Fos文档之后,我开始创建一个自定义用户提供程序,但我必须在较低级别实现的接口(UserProviderInterface)似乎需要“loadUserByUsername”方法 我的问题是:实现多字段登录的最佳方式是什么? 多谢各位 假设您使用的是FOSUserBundle,并且不使用用户名字段,我认为更简单的方法是“组合”您的3个字段,并将它们用作用户名 为此,您需要: 自定义登录表单。隐藏用户名字段并添

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

我的问题是:实现多字段登录的最佳方式是什么?
多谢各位

假设您使用的是FOSUserBundle,并且不使用
用户名
字段,我认为更简单的方法是“组合”您的3个字段,并将它们用作
用户名

为此,您需要:

  • 自定义登录表单。隐藏用户名字段并添加您的用户名
  • 创建一个
    kernel.request
    侦听器,读取您的3个字段,并将
    username
    字段添加到
    request
    对象中。一旦你这样做了,你就进入了“正常”流程
假设我有这些数据:

  • me@mymail.com
  • MyRandomString

  • 1@hpatio谢谢,您的解决方案非常有效:)只有一个细节需要解决:侦听器优先级必须设置为31

    根据文档(),
    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 }
    

    您可以将
    loadUserByUsername
    视为一种通过唯一标识符获取用户的方法。用户是否有唯一的字段?是的,id,以db为单位。我逻辑上认为独特的是我提到的三个领域的结合。一个三元组标识一个用户,所以两个用户可以有相同的电子邮件和相同的“字符串”值?确切地说,它可以不同,只是第三个值,在这种情况下,它将是一个不同的用户,用户还需要在登录表单中插入密码?这正是我所想的:)我已经这样做了。。。谢谢,我会让你知道的。很好。如果您需要更多详细信息,请告诉我。我可以问您一个kernel.request侦听器的示例吗?我从未使用过它,尤其是在请求中添加内容。。。非常感谢。
    services:
      listener.compose_username_listener:
        class: My\PersonBundle\Listener\MyLoginFieldFormatterListener
        tags:
          - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 255 }
    
    services:
      listener.compose_username_listener:
        class: My\PersonBundle\Listener\MyLoginFieldFormatterListener
        tags:
          - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 31 }