Yura YuLife

ITエンジニアの覚え書き。

Django 1.8にAxesを追加する

連続ログイン失敗時にアカウントをロックする機能を追加できるプラグインdjango-axesのインストール手順です。

環境

django-axes のインストール

$ pip install django-axes

settings.pyの編集

vi settings.py

INSTALLED_APPS = (
    # 以下の1行を追記
    'axes',

)

MIDDLEWARE_CLASSES = (
    # 以下の1行を追記
    'axes.middleware.FailedLoginMiddleware'
)

# ログイン失敗は連続5回まで
AXES_LOGIN_FAILURE_LIMIT = 5
# ログインを連続失敗した場合は24時間アカウントロック
AXES_COOLOFF_TIME = 24
# AXES_LOGGERはデフォルトでは'axes.watch_login'となっているので、
# ログイン失敗をログ出力するためには、
# 'axes.watch_login'というロガーを作成するか
# 独自のロガーインスタンスにて行う
AXES_LOGGER = 'custom_logger'

urls.pyの編集

vi urls.py

from django.conf.urls import include, url
from django.contrib.auth import views as auth_views
from axes.decorators import watch_login

urlpatterns = [
    url(r'^$', hoge_page),
    url(r'^hoge/', include('hoge.urls')),

    ...

    # ログイン画面でwatch_loginデコレータを設定
    url(r'^login/$', watch_login(auth_views.login),
        {'template_name': 'auth/login.html'}, name='login'),
]

templateの編集

vi auth/login.html

<!-- ログインフォームのPOST先URLを以下のように設定 -->
<!-- url 'django.contrib.auth.views.login' とするとエラーを吐くので注意 -->
<form role="form" method="post" action="{% url 'login' %}?next={{ next }}">
  {% csrf_token %}
  {{ form.non_field_errors }}
  <div>
    <input type="text" placeholder="ユーザ名" id="id_username" name="username" maxlength="254" required autofocus>
  </div>
  <div>
    <input type="password" placeholder="パスワード" id="id_password" name="password" required>
  </div>
  <input type="submit" value="ログイン">
</form>

マイグレーションの実行

$ ./manage.py migrate

マイグレーションを実行すると、管理サイト内にAxesというAppとAccess attempts, Access logsという項目が表示されます。

参考サイト