これを行うための最も互換性のある方法は、サイト モデルへの外部キーを含むユーザー プロファイル モデルを作成し、その FK の値に対して現在のサイトをチェックするカスタム認証バックエンドを作成することです。サンプルコード:
app/models.py でプロファイル モデルを定義します。
from django.db import models
from django.contrib.sites.models import Site
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
site = models.ForeignKey(Site)
デフォルトのものから継承して、カスタム認証バックエンドを作成します。たとえば、app/auth_backend.py に記述します。
from django.contrib.auth.backends import ModelBackend
from django.contrib.sites.models import Site
class SiteBackend(ModelBackend):
def authenticate(self, **credentials):
user_or_none = super(SiteBackend, self).authenticate(**credentials)
if user_or_none and user_or_none.userprofile.site != Site.objects.get_current():
user_or_none = None
return user_or_none
def get_user(self, user_id):
try:
return User.objects.get(
pk=user_id, userprofile__site=Site.objects.get_current())
except User.DoesNotExist:
return None
この認証バックエンドは、すべてのユーザーがプロファイルを持っていることを前提としています。ユーザーの作成/登録プロセスで常に作成されるようにする必要があります。
オーバーライドさauthenticate
れたメソッドにより、ユーザーは正しいサイトにのみログインできるようになります。このget_user
メソッドは、ユーザーのセッションに保存されている認証情報に基づいて、データベースからユーザーをフェッチする要求ごとに呼び出されます。私たちのオーバーライドは、ユーザーがサイト A にログインし、同じセッション Cookie を使用してサイト B への不正アクセスを取得できないようにします (後者のケースを処理する必要性を指摘してくれた Jan Wrobel に感謝します)。