我尝试基于3个字段(字符串,布尔值和电子邮件)实现用户身份验证。在Symfony2和Fos文档之后,我开始创建一个自定义用户提供程序,但似乎我必须在较低级别实现的接口(UserProviderInterface)需要" loadUserByUsername"方法。
我的问题是:哪个是实现多个字段登录的最佳方式? 非常感谢你!
答案 0 :(得分:0)
假设您使用的是FOSUserBundle并且您没有使用username
字段,我认为更简单的方法是“撰写”您的3个字段并将其用作username
要做到这一点,你需要:
kernel.request
侦听器,读取您的3个字段,并将username
字段添加到request
对象。完成此操作后,您处于“正常”流程假设我有这些数据:
在数据库中,username
my@mymail.com|MyRandomString|1
为namespace 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 }