読者です 読者をやめる 読者になる 読者になる

DeviseのLockable moduleについて少し調べた

Rails

DeviseはRailsで使用出来るユーザ認証プラグインです。
少しカスタマイズしようとすると面倒面倒という評判聞きませんが今のところまだ面倒な場面に出くわしていないので幸運のようです。


Deviseは12つのモジュールで構成されていますがその中のロック系の実装があるLockableモジュールについて少し調べたのでメモ


対象バージョン

  • Devise 2.1.0


だいたいはここにあることを見たりソースみたりして実装を自分なりに理解したという感じです。

機能

ロック
  • ログイン指定回数(maximum_attempts)以上失敗した場合に該当ユーザをロックする
アンロック
  • ロック後指定時間(unlock_in)秒経過した場合にユーザをアンロック
  • ロックされたユーザのemailアドレス宛にアンロックトークンを送信する。アンロックトークンが一致したらアンロック
  • アンロックはさせない

設定

maximum_attempts

  • ログイン試行可能回数

lock_strategy

  • ロックするための方法
    • :failed_attempts : 失敗した回数
    • :none : ログイン失敗時にロックはしない

unlock_strategy

  • アンロックする為の方法
    • :time : ロック後指定時間(unlock_in)後にアンロック
    • :email : アンロックトークンを該当ユーザのメールアドレスに送信
    • :both : :timeと:email両方
    • :none : アンロックさせない

unlock_in

  • ロック後アンロックするために必要な時間(unlock_strategyが :time or :both の時)
  • self.class.unlock_in.agoという実装なので2時間と指定したい場合は2.hoursと設定する

unlock_keys

  • 調べ中

アクセスロックかどうかを判断する

# Verifies whether a user is locked or not.
def access_locked?
  locked_at && !lock_expired?
end

このへんを使えばよい。ちなみにlock_expired?はlocked_atがunlock_in.agoよりも前の場合
現在時間 - 設定時間 でexpiredではない時間を出してそれより前ならOKというような日本語にしづらい感じ

protected
  # Tells if the lock is expired if :time unlock strategy is active
  def lock_expired?
    if unlock_strategy_enabled?(:time)
      locked_at && locked_at < self.class.unlock_in.ago
    else
      false
    end
  end