deviseでユーザ登録・認証を行っていて、「特定のユーザのアカウントを残しつつ、ログインできないようにしたい」とき。
deviseで管理しているモデル(UserやAdmin)に、「ログイン可否」の条件となるカラムを追加する。カラムの名前はcan_login
とかよりも、is_active
とか、is_deleted
とかの方がほかの処理でも使える汎用的な名前になるから良さそう。
次にUserモデルに以下のメソッドを追加。
def active_for_authentication?
super && self.is_active?
end
そのモデルのis_active
カラムがtrue
を返す(= 削除されたユーザでない)と、このメソッドはtrue
と評価され、ログインすることができる。反対にis_active
がfalse
の場合、ログインはできなくなる。ログインできない場合には、Devise::SessionsController#create
から401エラーが返されたのち、Devise::SessionsController#new
によって200 OKのレスポンスが返ってくるため、エラーのハンドリングやステータスのテストには注意が必要。
またログインが却下されたときのメッセージを編集するには、deviseのinactive_message
メソッドを同じくUserモデルにてオーバーライドする。active_for_authentication?
がfalseを返したときには、このメソッドによってflashメッセージが出力される。
def inactive_message
self.is_active? ? super : :special_condition_is_not_valid
end