如何在Symfony2中使用非标准用户名进行身份验证

时间:2013-09-10 12:27:52

标签: php authentication symfony

在我的网站上,使用手机进行身份验证。电话由两部分组成:代码和号码(“+7(代码)号码”)。它通过继承的表单字段类型实现:

PhoneType.php

class PhoneType extends TextType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('code', 'text')->add('number', 'text')
            ->addModelTransformer(new PhoneToStringTransformer());
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array('compound' => true));
    }
}

PhoneToStringTransformer.php

class PhoneToStringTransformer implements DataTransformerInterface
{
    public function transform($string)
    {
        if (!empty($string) && !preg_match('/^\+7\d{10}$/', $string)) {
            throw new TransformationFailedException('Incorrect phone format');
        }
        return array(
            'code' => substr($string, 2, 3),
            'number' => substr($string, 5));
    }

    public function reverseTransform($phone)
    {
         return sprintf('+7%s%s', $phone['code'], $phone['number']);
    }
}

但是当我尝试进行身份验证时,我会收到此警告:

  

警告:trim()期望参数1为字符串,在\ path \到\ project \ vendor \ symfony \ symfony \ src \ Symfony \ Component \ Security \ Http \ Firewall \ UsernamePasswordFormAuthenticationListener.php第79行中给出的数组

发生警告是因为它需要用户名作为字符串,但登录表单返回值是一个数组 如何使用非标准“用户名”(我的手机作为阵列)进行身份验证? 我使用标准的SecurityBundle。

应用/配置/ security.yml

providers:
    main:
        entity: { class: MyProject:User, property: phone }

firewalls:
    main:
        form_login:
            username_parameter: userForm[phone]

我不知道,如何指定username_parameter将其作为字符串userForm[phone][code] + userForm[phone][number]传递给UsernamePasswordFormAuthenticationListener。

1 个答案:

答案 0 :(得分:1)

确保您的yml文件正确缩进。您使用userForm[phone]的格式应该可以使用,因为我只是通过写出类似的参数来解决类似问题。

Symfony2, forms, username_parameter and firewall parameters