ほんじゃらねっと

ダイエット中プログラマのブログ

Djangoでカスタムログインチェック


djangoでユーザーがログイン済かどうかをチェックする場合は通常 @login_required デコレータを使用するけど、
IDとパスワード以外の要素でログインチェックしたり、未ログインのユーザーを独自のログイン画面に遷移させる
場合は、カスタマイズしたデコレータを作る。


ログイン条件を設定する関数として、djangoには user_passes_testという関数が用意されており、
login_requiredデコレータもその関数を呼び出している。
カスタマイズしたデコレータを作成するには、独自の条件でuser_passes_testを呼び出してやれば良い。


たとえば、ユーザーが「company.is_company_user」というパーミッションを持つ場合のみログインできるようにしたい場合。


project/company/utils.py

from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.conf import settings
def _company_user_check(user):
if not user.is_superuser and not user.is_staff and user.is_authenticated() and user.has_perm("company.is_company_user"):
return True
else:
return False
def company_login_check(function=None, redirect_field_name=REDIRECT_FIELD_NAME):
actual_decorator = user_passes_test(
_company_user_check,
redirect_field_name=redirect_field_name,
login_url=settings.COMPANY_LOGIN_URL # 独自のログインページに飛ばす
)
if function:
return actual_decorator(function)
return actual_decorator


このような関数を作成しておき、このチェックを使用したいビュー関数を下記のような感じで作成する

from project.company.utils import company_login_check
@company_login_check
def company_user_only_view(request):
...