如果存储在 MyBB cookie 中的 user_id 代表 Django 数据库中的同一用户,那么您可以使用默认的 Django 后端直接从该 id 获取用户对象。如果这些 ID 不匹配,您需要自定义后端来获取 Django 用户对象。要从 MyBB cookie 中获取用户 ID 并根据它更新用户,您需要有一个自定义的身份验证中间件。
中间件
主要思想是获取用户对象(基于您的身份验证逻辑)并将其分配给 request.user。这是一个示例(未测试)。
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 站点的每个请求,都会调用此方法。为了性能,您可以缓存用户和/或做一个惰性对象技巧,EXAMPLE。
后端
如果您需要编写自己的逻辑来获取用户对象和验证用户,您可以执行以下操作。
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
您需要在站点设置文件中添加自定义后端和中间件。