You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django自定义ModelBackend的get_user方法中获取Cookies

在自定义认证后端的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:35:24