Deviseで認証でつかう要素を変更する
久しぶりにdeviseを触ってて、認証方式のカスタマイズでハマったのでメモ。
email, passwordに加えてある要素で認証させたいときの解決方法です。
ベースは公式wikiに書いてあった方法を参考にしてます。
How to: Scope login to subdomain · plataformatec/devise Wiki
class User devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, authentication_keys: [:email, :subdomain] def self.find_first_by_auth_conditions(warden_conditions) to_adapter.find_first(warden_conditions) end end
authentication_keys
で認証に使う属性を指定する。ここで指定した属性はサインイン時にパラメーターとして送らないと認証が通らなくなるので注意validatable
を外す。validatable
にはemailのuniquenessのバリデーションが定義されているので、同じemailが登録できなくなってしまうため。なのでemailのバリデーションが外れてしまうので、独自に実装する必要ありfind_first_by_auth_conditions
は認証時にユーザを特定するために通るメソッド。ここを拡張することで認証を変えることができる。to_dapter.find_first
はwhere(condition).first
と同じ動き。devise内部ではこのメソッドでクエリ発行している(キャッシュの機能がついてる)User.invite!
のときもこのメソッド通るので、 招待機能(:invitable
) をつけるときはこのメソッドを拡張すること。そうでない場合はwikiにある通りfind_for_authentication
でも良い