特定のユーザのアカウントは残しつつ、ログインできないようにしたい

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_activefalseの場合、ログインはできなくなる。ログインできない場合には、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

Recent Posts

Loading...