Djangoでログイン試行回数制限を付けられる「django-axes」の使い方

ノウハウ
スポンサーリンク

この記事では、Djangoでログイン試行回数を付けられる「django-axes」のカスタマイズ方法をまとめました。

「django-axes」の導入方法については、以下のブログを参考にしてください。

Djangoのユーザ認証機能にログイン試行回数制限を追加する
この記事では、Djangoのユーザ認証機能に「django-axes」というライブラリを使って、ログイン試行回数制限を追加する方法を紹介します。

 

目次

 


  

「django-axes」でカスタマイズできること

Djangoの設定ファイル(settings.py)に「django-axes」の設定値を定義することで、カスタマイズすることができます。
代表的なものとしては、以下のようなカスタマイズができます。

設定値デフォカスタマイズ内容
AXES_FAILURE_LIMIT3ロックされるまでのログイン回数
AXES_COOLOFF_TIMENone自動でロックが解除されるまでの時間(単位は時間)
AXES_ONLY_USER_FAILURESFalseTrueにしたら、ロック対象をIPアドレスではなくユーザ名で判断する
AXES_USE_USER_AGENTFalseTrueにしたら、ロック対象をIPアドレスorユーザ名で判断する
(AXES_ONLY_USER_FAILURES設定時は無効化)
AXES_LOCKOUT_TEMPLATENoneロック画面のテンプレートを指定する
AXES_LOCKOUT_URLNoneロック画面のURLを指定する
(AXES_LOCKOUT_TEMPLATEを設定したらそちらを優先)
AXES_VERBOSETrueTrueにしたら、Axesの詳細ログを見れる
AXES_IP_BLACKLISTNoneブラックリストにするIPアドレスを指定する
AXES_IP_WHITELISTNoneホワイトリストにするIPアドレスを指定する
AXES_RESET_ON_SUCCESSFalseTrueにしたら、ログインに成功したら失敗回数をリセットする

詳細は以下の公式サイトをご確認ください。

 

 

いろいろとカスタマイズしてみる!

以下のユースケースに対して、Djangoの設定ファイル(settings.py)へのカスタマイズ方法をまとめます。

  • ログイン試行回数を変更する
  • 自動でロックが解除される時間を設定する
  • ユーザ名によってアカウントロックできるようにする
  • アカウントロックされたときに表示される画像を変更する
  • ログインに成功したら失敗回数をリセットする
  • リバースプロキシを使った場合でも利用できるようにする

 

ログイン試行回数を変更する

デフォルトの設定では、3回ログインに失敗するとアカウントがロックされます。
これを変更するには、Djangoの設定ファイル(settings.py)に以下のように設定します。

【settings.py】

AXES_FAILURE_LIMIT  = {ログイン試行回数}
  • 例えば、5回に設定したいなら、「AXES_FAILURE_LIMIT = 5」と設定します。

 

自動でロックが解除される時間を設定する

デフォルトの設定では、一度ロックされると手動でロックを解除しないといけません。

一定時間後に自動でロックが解除されるようにするには、Djangoの設定ファイル(settings.py)に以下のように設定します。

【settings.py】

AXES_COOLOFF_TIME = {自動でロックを解除するまでの時間(単位は時間)}
  • 例えば、6時間後に自動でロックが解除するようにするためには、「AXES_COOLOFF_TIME = 6」と設定します。

 

ユーザ名によってアカウントロックできるようにする

デフォルトの設定では、接続元IPアドレスによってロック対象を判断しています。
これをユーザ名によってロック対象を判断するには、Djangoの設定ファイル(settings.py)に以下のように設定します。

【settings.py】

AXES_ONLY_USER_FAILURES = True
  • デフォルトはFalseであり、Trueにすることでロック対象をIPアドレスではなくユーザ名で判断するようになります。

 

アカウントロックされたときに表示される画像を変更する

デフォルトの設定では、以下のような「Account locked: too many login attempts.~」という英語表記のロック画面が表示されます。

 

これを、任意のテンプレートに変換するには、Djangoの設定ファイル(settings.py)に以下のように設定します。

【settings.py】

AXES_LOCKOUT_TEMPLATE = {テンプレートのパス}
  • 例えば、「templates/registration/lockout.html」にテンプレートを設置した場合は、「AXES_LOCKOUT_TEMPLATE = 'registration/lockout.html'」と設定します。
  • テンプレートを新規に設置した場合は、Djangoの設定ファイル(settings.py)のTEMPLATES[{'DIRS: [ ],'}]を合わせて設定が必要です。

 

ログインに成功したら失敗回数をリセットする

デフォルトの設定では、ログイン成功したとしても、ログイン失敗回数はリセットされず、累計でロックの判断をされてしまいます。
これをログイン成功したらログイン失敗回数をリセットするには、Djangoの設定ファイル(settings.py)に以下のように設定します。

【settings.py】

AXES_RESET_ON_SUCCESS = True
  • デフォルトはFalseであり、Trueにすることでログイン成功したらログイン失敗回数をリセットするようになります。

 

リバースプロキシを使った場合でも利用できるようにする

デフォルトの設定では、「django-axes」が動作しているサーバにアクセスしてきた送信元IPアドレスをもとにロックを判定します。
しかし、以下のようにNginx等のリバースプロキシが入っていると、サーバにアクセスする送信元IPアドレスはリバースプロキシのIPアドレスに変換されてしまうため、本来ロックされるべきログインしようとしている接続元IPアドレスによらず、ロックをしてしまいます。

 

これをログインしようとしている接続元IPアドレスに対して、ロック判定するようにするには、HTTPヘッダのX_FORWARD_FORで判断するように変更すればよいです。
Djangoの設定ファイル(settings.py)に以下のように設定します。

【settings.py】

AXES_META_PRECEDENCE_ORDER = [
    'HTTP_X_FORWARDED_FOR',
]

 

関連情報

Djangoのユーザ認証機能の実装方法を以下にまとめました。よろしければ、ご覧になってください。

 

自分は、DjangoをConoHa VPS上のDockerコンテナ上に構築しています。構築方法や挑戦したことなどを以下のブログにまとめたので、よろしければご覧になってください。

 

参考

 

広告

Djangoをやるなら以下の書籍がオススメです。
DjangoでWebアプリを開発するときの要点が分かりやすくまとめられています。

 

以上!

コメント

タイトルとURLをコピーしました