My_Auth_Lock

My_Auth_Lockは認証のロックを行うコンポーネントです。認証失敗が短期間に連続して発生した時、セキュリティのため一定期間認証を中断する事を目的としています。

基本的な使用方法

このモジュールでは認証失敗の情報を保存するためにsys_auth_lockテーブルを使用しています。指定の認証に失敗した時、失敗した情報を保存します。保存した情報から、一定時間内に指定した回数だけ認証に失敗し、かつロック解除までの時間が経過していないかを判定します。このモジュールは認証失敗ログの保存、及びロック状態であるかの判定のみを行います。そのため、ロック状態であった場合の例外処理はコントローラに記述する必要があります。

認証失敗によるロックを実現するにはcontroller中に次のように記述します。

$auth_lock = new My_Auth_Lock($lock_duration, $lock_count, $lock_time);

if($auth_lock->isLock($code, $id)){
    // ロックされている場合の例外処理
}

// 認証に失敗した場合はエラー処理情報を追加する
if($auth === 'false'){
    $auth_lock->addError($code, $id);
}

...

$lock_durationはロックが発生するための時間、$lock_countはロック発生までのエラー回数、$lock_timeはロック発生から解除までの時間です。これらの変数はいずれも省略可能で、省略した場合にはデフォルトの値が使用されます。デフォルトでは10分間に3回認証に失敗した時、1時間ロックされます。

$codeは処理の種別を特定するための識別子で、任意の文字列です。$idは認証で使用したidで、$codeと$idの組み合わせをキーとして認証エラー回数をカウントします。$idは省略可能で、idを省略した場合には替わりに$codeとIPアドレスの組み合わせをキーとして認証エラーをカウントします。

認証失敗ログのリセット

sys_auth_lockテーブルは認証失敗のログを保存しますが、判定対象となる期間を過ぎたログは不要です。ログを残す必要がなければ定期的に過去のログを削除する事でテーブル容量の節約が可能です。

$auth_lock = new My_Auth_Lock($lock_duration, $lock_count, $lock_time);
$auth_lock->refresh();

このようにrefreshメソッドを使用する事で判定対象期間外のログを削除できます。