Laravel PostgreSQL不区分大小写

5

我正在使用Laravel 4.1和PostgreSQL作为数据库编写web应用程序。

由于数据库区分大小写,但是我希望它不区分大小写,因为例如,当用户登录时,他应该能够使用大写或小写的电子邮件地址访问(就像在其他网站上一样)。但是,密码哈希列必须区分大小写,因为我使用的加密方法生成区分大小写的字符串。

我正在使用Laravel的Eloquent ORM,因此我不直接编写查询语句。

我该如何解决这个问题?

提前感谢!


lower(email_address)创建索引?还是在输入时规范化您的电子邮件地址? - Rup
2个回答

16

有点晚了,但这很简单。只需使用“ILIKE”运算符,例如:

User::where("email", "ILIKE", $email)->get();

1
然而,ILIKE不使用索引!为此,在pgsql中对较小的值进行索引是正确的方法。 - foaly
1
这是危险的!!!考虑让某人在电子邮件末尾放置%以选择一个随机用户,例如不要写“john.smith@gmail.com”,而是写“joh%”,然后从您的数据库中选择电子邮件? - Hop hop

0

我曾经遇到过这个问题,我的解决方案是“假装”不区分大小写:

1)在相关方法中添加一行代码,将输入的电子邮件值转换为小写

2)在数据库中进行替换,使电子邮件变成小写

3)确保新的电子邮件以小写形式输入

细节如下:

1)相关方法*是核心Laravel代码,因此您可以使用新版本覆盖它们,以在验证请求后替换电子邮件值: $request['email'] = Str::lower($request['email']);

  • 登录流程:从AuthenticatesUsers trail中的postLogin函数,我添加了AuthController.php postLogin
  • 密码重置流程:从ResetsPassword trail中的postEmail和postReset函数,我将它们添加到PasswordController.php中

2)更新用户设置电子邮件= lower(email);

3)对于我来说,这很容易,因为我自己创建所有用户(我的网站只是为家庭服务),但您可以在身份验证流程中执行类似的操作

希望这可以帮助到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接