如何在Django自定义ModelBackend的get_user方法中获取Cookies
问题描述
我使用自定义用户模型和自定义认证后端AuthBackend,现在需要在该后端的get_user方法中获取请求的Cookies信息,现有代码如下:
class AuthBackend(ModelBackend): def authenticate(self, request, **kwargs): login = request.POST.get('username') login = kwargs['username'] password = kwargs['password'] logger.info(password) try: auth_user = Company_Users.objects.get(auth_login=login) hash_password = hashlib.sha512(password.encode('utf-8')).hexdigest() if auth_user.auth_password == hash_password: auth_user.is_active = True auth_user.is_authenticated = True return auth_user except Company_Users.DoesNotExist: pass def get_user(self, user_id): ### here i need cookies info <----------------- HERE try: user = Company_Users.objects.filter(pk=user_id).first() if user is None: return None return user except User.DoesNotExist: return None
解决方案
Django默认的get_user方法只接收user_id参数,无法直接获取request对象(也就拿不到Cookies),需要通过以下步骤实现:
1. 自定义认证中间件
替换Django默认的AuthenticationMiddleware,在中间件中把request传递给后端的get_user方法:
from django.contrib.auth.middleware import AuthenticationMiddleware from django.contrib.auth import get_user class CustomAuthMiddleware(AuthenticationMiddleware): def process_request(self, request): request.user = get_user(request)
然后修改settings.py中的MIDDLEWARE配置,替换默认的认证中间件:
MIDDLEWARE = [ # ...其他中间件 'your_app.middleware.CustomAuthMiddleware', # 替换成自定义中间件的路径 # ... ]
2. 自定义get_user函数(可选)
如果需要更灵活的控制,可以自己实现get_user函数,确保传递request到后端:
from django.contrib.auth import load_backends def custom_get_user(request): user_id = request.session.get('_auth_user_id') backend_path = request.session.get('_auth_user_backend') if user_id and backend_path: backend = load_backends(backend_path)[0] # 将request传入get_user方法 return backend.get_user(request, user_id) return None
之后在自定义中间件中使用这个custom_get_user替代默认方法即可。
3. 修改自定义认证后端的get_user方法
更新AuthBackend的get_user方法,添加request参数,即可直接获取Cookies:
class AuthBackend(ModelBackend): # 保留原有的authenticate方法不变 def get_user(self, request, user_id): # 通过request.COOKIES获取指定Cookie target_cookie = request.COOKIES.get('your_cookie_name') # 可根据需求使用Cookie信息 print(f"获取到的Cookie内容:{target_cookie}") try: user = Company_Users.objects.filter(pk=user_id).first() return user if user else None except Company_Users.DoesNotExist: # 注意捕获自定义用户模型的异常,而非默认User return None
注意事项
- 自定义中间件在
MIDDLEWARE中的位置要正确,需放在依赖用户认证的中间件之前。 - 原代码中的
except User.DoesNotExist需改为except Company_Users.DoesNotExist,匹配自定义用户模型的异常。 - 确保修改后的认证流程不会破坏原有业务逻辑。
内容的提问来源于stack exchange,提问作者Yuretz
相关产品推荐
相关产品推荐

