【问题标题】:Laravel postgresql case insensitiveLaravel postgresql 不区分大小写
【发布时间】:2014-02-15 07:25:06
【问题描述】:

我正在编写一个使用 Laravel 4.1 和 Postgresql 作为数据库的 Web 应用程序。 数据库区分大小写,但我想让它不区分大小写,因为,即当用户登录时,他应该能够使用大写或小写电子邮件地址(就像在其他所有网站中一样)进行访问。但是密码的哈希列必须区分大小写,因为我使用的加密方法会生成区分大小写的字符串。

我使用的是 Laravel 的 Eloquen ORM,所以我不直接编写查询。

我该如何解决这个问题?

提前致谢!

【问题讨论】:

  • 让它区分大小写但在lower(email_address)上创建索引?或者在输入时标准化您的电子邮件地址?

标签: postgresql laravel eloquent case-sensitive case-insensitive


【解决方案1】:

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

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

【讨论】:

  • 但是,ILIKE 不使用索引!为此,在 pgsql 中采用较低值的索引。
  • 这是危险的!!!考虑让某人在电子邮件末尾放置 % 来选择一个随机用户,而不是写“john.smith@gmail.com”,而是写“joh%”并选择您的电子邮件数据库?
【解决方案2】:

我遇到了这个确切的问题 - 我的解决方案是 假装 不区分大小写:

1) 在相关方法中添加一行,使输入的email值小写

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

3) 确保新电子邮件以小写形式出现

详情:

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

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

2) 更新用户设置 email = lower(email);

3) 对我来说这很容易,因为我自己创建了所有用户(我的网站仅供家庭使用)- 但你会在身份验证流程中做类似的事情

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多