gpt4 book ai didi

ruby-on-rails - Devise:允许用户注册为 "UsErNaMe"但使用 "username"登录

转载 作者:行者123 更新时间:2023-12-03 00:52:37 27 4
gpt4 key购买 nike

与大多数网站的工作方式相同,我将“UsErNaMe”存储在数据库中,但让用户使用“用户名”登录。

这是一个相当明显且必要的功能,很多人似乎都问过它,但我不断遇到的解决方案似乎与 Devise 自己的文档脱节。

例如,考虑这篇博文:http://anti-pattern.com/2011/5/16/case-insensitive-keys-with-devise

[...]you’ve probably run into the problem that some users like to type certain letters in their logins (email and/or username) in uppercase, but expect it to be case-insensitive when they try to sign in. A not unreasonable request[...]

酷!这就是我想要的。

他的解决方案:

# config/initializers/devise.rb
Devise.setup do |config|
config.case_insensitive_keys = [:email, :username]
end

这就是我一直在寻找的解决方案。但这里是该配置选项的文档:

# Configure which authentication keys should be case-insensitive.
# These keys will be downcased upon creating or modifying a user and when used
# to authenticate or find a user. Default is :email.
config.case_insensitive_keys = [ :username, :email ]

特别是:“这些键将在创建/修改用户时小写。”换句话说,用户名在数据库中被小写。

验证:

User.create username: "UsErNaMe", password: "secret", email: "email@com.com"
#=> <User username="username"...>

我是否遗漏了一些非常明显的东西?

最佳答案

来自devise wiki :您需要在模型中覆盖 devise 的 find_first_by_auth_conditions 方法。

ActiveRecord 示例:

def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end

如果您也不需要通过电子邮件进行身份验证,则可以删除 OR lower(email) = :value 部分。

这样您就不需要在 case_insensitive_keys 中列出用户名,并且它不会在数据库中小写。

关于ruby-on-rails - Devise:允许用户注册为 "UsErNaMe"但使用 "username"登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10532032/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com