10

ほとんどの Web サイトが機能するのと同じように、"UsErNaMe" をデータベースに保存し、ユーザーは "username" でログインできるようにしました。

これはかなり明白で必要な機能であり、多くの人がそれを求めているようですが、私がつまずき続けている解決策は、Devise 自身のドキュメントから切り離されているようです。

たとえば、次のブログ記事を考えてみましょう: http://anti-pattern.com/2011/5/16/case-insensitive-keys-with-devise

[...] ログイン時に特定の文字 (電子メールやユーザー名) を大文字で入力するユーザーがいるにもかかわらず、サインイン時に大文字と小文字が区別されないことを期待しているという問題に遭遇したことがあるでしょう。無理のないお願い[…]

涼しい!それが私が欲しいものです。

彼の解決策:

# 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"...>

痛いほど明白な何かが欠けていますか?

4

1 に答える 1

11

devise wikiから:find_first_by_auth_conditionsモデル内の devise のメソッドを上書きする必要があります。

アクティブレコードの例:

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電子メールによる認証も必要ない場合は、一部を削除できます。

そうすれば、リストする必要がusernameなくcase_insensitive_keys、データベースで小文字化されません。

于 2012-05-10T11:08:11.800 に答える