deepblue-will’s diary

JS、CSS,Ruby、Railsなど仕事や趣味で試した技術系のことを書いていきます。

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_firstwhere(condition).first と同じ動き。devise内部ではこのメソッドでクエリ発行している(キャッシュの機能がついてる)
    • User.invite! のときもこのメソッド通るので、 招待機能( :invitable ) をつけるときはこのメソッドを拡張すること。そうでない場合はwikiにある通り find_for_authentication でも良い