MyBB cookieに保存されているuser_idがDjangoデータベース内の同じユーザーを表す場合、デフォルトのDjangoバックエンドを使用してそのIDから直接ユーザーオブジェクトを取得できます。これらのIDが一致しない場合は、Djangoユーザーオブジェクトを取得するためのカスタムバックエンドが必要です。MyBB CookieからユーザーIDを取得し、それに基づいてユーザーを更新するには、カスタム認証ミドルウェアが必要です。
ミドルウェア
主なアイデアは、(認証ロジックに基づいて)ユーザーオブジェクトをフェッチし、それをrequest.userに割り当てることです。これが1つの例です(テストされていません)。
from django.contrib import auth
class MyBBMiddleware:
def process_request(self, request):
user_cookie_name = "session_key"
if user_cookie_name not in request.COOKIES:
# log user out if you want
return
id = request.COOKIES.get(user_cookie_name)
# this will find the right backend
user = auth.authenticate(id)
request.user = user
# if you want to persist this user with Django cookie do the following
#auth.login(request, user)
これは、Djangoサイトに送信されるすべてのリクエストに対して呼び出されることに注意してください。パフォーマンスのために、ユーザーをキャッシュしたり、怠惰なオブジェクトのトリックを実行したりできます(例) 。
バックエンド
ユーザーオブジェクトをフェッチしてユーザーを認証するための独自のロジックを作成する必要がある場合は、次のようにすることができます。
class MyBBCookieBackend(object):
def authenticate(self, user_id):
return self.get_user(user_id)
def get_user(self, user_id):
# if user_id is not the same in Django and MyBB tables,
# you need some logic to relate them and fetch Django user
try:
#TODO your custom logic
user = User.objects.get(id=user_id)
return user
except User.DoesNotExist:
return None
カスタムバックエンドとミドルウェアをサイト設定ファイルに追加する必要があります。