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

如何在Django与CI4应用间实现跨应用会话持久化?

跨Django与CI4应用的会话认证持久化问题解决方案

问题核心原因

Django的会话依赖浏览器端的sessionid Cookie来识别用户。当CI4作为后端向Django发送POST请求创建会话时,Django生成的sessionid Cookie会返回给CI4的HTTP客户端,但不会自动同步到用户的浏览器中。因此用户后续直接访问Django时,浏览器没有携带该Cookie,Django无法识别会话,触发登录页面重定向。

具体解决步骤

1. 让CI4转发Django的会话Cookie到用户浏览器

当CI4收到Django返回的认证成功响应时,需要提取响应头中的Set-Cookie字段,并将其设置到CI4对用户的响应中,让浏览器保存Django的sessionid Cookie。

CI4侧示例代码:

// CI4中调用Django认证接口的逻辑
$client = \Config\Services::request();
$response = $client->post('http://你的Django应用域名/login_view_endpoint', [
    'form_params' => [
        'username' => $username,
        'password' => $password
    ]
]);

if ($response->getBody() === 'true') {
    // 提取Django返回的会话Cookie
    $djangoSessionCookie = $response->getHeaderLine('Set-Cookie');
    // 将Cookie转发给用户浏览器
    $this->response->setHeader('Set-Cookie', $djangoSessionCookie);
    // 处理CI4自身的登录逻辑
    return $this->response->setJSON(['status' => 'success']);
} else {
    return $this->response->setJSON(['status' => 'fail']);
}

2. 配置Django的跨域会话Cookie(若域名不同)

如果Django和CI4不在同一域名下,需要修改Django的settings.py,让会话Cookie支持跨域共享:

# settings.py
# 假设主域名是example.com,Django在django.example.com
SESSION_COOKIE_DOMAIN = '.example.com'
# 若使用HTTPS,开启以下配置
SESSION_COOKIE_SECURE = True
# 可选:限制Cookie仅通过HTTP协议传递,防止XSS窃取
SESSION_COOKIE_HTTPONLY = True

3. 替换Django默认的登录校验逻辑

你遇到的重定向问题,大概率是Django的视图使用了login_required装饰器,或者默认的认证中间件依赖Django自带的auth模块。可以自定义中间件,通过检查request.session['utilisateur']来判断用户是否登录:

# 自定义认证中间件
class CustomAuthMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 检查会话中是否存在用户ID
        if 'utilisateur' in request.session:
            try:
                # 将用户对象绑定到request,方便视图调用
                request.user = Utilisateur.objects.get(id=request.session['utilisateur'])
            except Utilisateur.DoesNotExist:
                del request.session['utilisateur']
                request.user = None
        else:
            request.user = None
        response = self.get_response(request)
        return response

然后在settings.py的MIDDLEWARE中,替换默认的django.contrib.auth.middleware.AuthenticationMiddleware为这个自定义中间件。

4. 验证会话是否成功创建

在Django的login_view_endpoint中,添加会话ID的打印,同时检查Django的django_session表是否存在对应的会话记录:

@csrf_exempt 
def login_view_endpoint(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        user = Utilisateur.checkuser(username, password)
        if user:
            request.session['utilisateur'] = user.id
            # 打印会话ID,用于验证
            print("会话ID:", request.session.session_key)
            return HttpResponse('true')
        else:
            return HttpResponse('false')
    else:
        return HttpResponse('false')

内容的提问来源于stack exchange,提问作者user23976798

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:15:55