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): ...