Symfony2中不区分大小写的用户名

时间:2015-07-27 20:30:04

标签: symfony username case-insensitive

默认情况下,Symfony2以区分大小写的方式匹配用户名。我希望用户能够输入 johnsmith JohnSmith johnSMITH 或其任何变体,并将它们全部注册为 JohnSmith对。我该怎么做?

我虽然最简单的方法是在比较它们之前始终将每个用户名转换为小写。这一方面很容易做到(只是将lower()抛出到SQL语句中),但是如何在登录表单中输入用户输入的内容呢?由于Symfony自动处理login_check路由处理,我无法弄清楚。

更好的是,我可以设置一些选项以启用不区分大小写吗?

5 个答案:

答案 0 :(得分:0)

您是否尝试使用CSS将输入转换为小写?实际上有一些方法可以在将数据输入传递给login_check控制器之前对其进行控制,但是如果你想快速修复它的话:

p {
    text-transform: lowercase;
}

答案 1 :(得分:0)

在您的public function setUsername($username) { $this->username = mb_strtolower($username); return $this; } 中,您可以将文字更改为小写,例如..

usernameCanonical

作为参考,FOSUserBundle通过在canonicalEmail电话中“规范化”用户名(至updateUser)和电子邮件地址(至MAX())来处理此问题(请参阅Doctrine\UserManager调用Canonicalizer),然后将其用于搜索。

答案 2 :(得分:0)

我觉得自己像个白痴。我所要做的就是在我的SQL语句中的lower()子句周围添加另一个where。像这样:

select lower(USERNAME) as USERNAME, PASSWORD, ROLES, ALL_CUSTOMER_ACCESS
from COMPANYNAME_USERS
where lower(USERNAME) = lower(:username)

答案 3 :(得分:0)

您已经修复过,但我会为有类似问题的用户解释另一种解决方案:

  1. 您必须以这种方式实施自己的提供商:http://symfony.com/doc/current/cookbook/security/entity_provider.html#authenticating-someone-with-a-custom-entity-provider
  2. 在方法loadUserByUsername中使用以下查询:

    $user = $this->findOneBy(array('username' => strtolower($username)));

  3. 这对我有用。 (也在Doctrine Mongo ODM中)

答案 4 :(得分:0)

在UserRepository中编写正确的loadUserByUsername函数。 它不能区分大小写:

public function loadUserByUsername($username)
{
    $user = $this->createQueryBuilder('u')
        ->where('LOWER(u.email) = :username')
        ->setParameter('username', strtolower($username))
        ->getQuery()
        ->getOneOrNullResult();

    if ($user){
       return $user;
    }

    throw new UsernameNotFoundException('Unable to find user "' . $username . '"');
}