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

如何限制Django Admin会话时长并在用户操作后刷新会话有效期

如何限制Django Admin会话时长并在用户操作后刷新会话有效期

嘿,这个需求其实挺常见的,尤其是对后台管理的安全性有要求的场景,我给你分享两种实用的实现方式,你可以根据自己的项目情况来选:

一、全局生效的快速配置(适合整个站点统一控制)

如果你的整个Django项目(包括前端用户和Admin后台)都需要相同的会话超时规则,直接修改settings.py里的配置就能搞定:

  • 设置会话有效期:把SESSION_COOKIE_AGE改成你想要的秒数,比如30分钟就写1800:
    SESSION_COOKIE_AGE = 1800  # 单位:秒,30分钟
    
  • 开启操作刷新有效期:添加SESSION_SAVE_EVERY_REQUEST = True,这样用户每做一次操作(不管是点击Admin的按钮还是刷新页面),会话的有效期都会重新计算:
    SESSION_SAVE_EVERY_REQUEST = True
    
  • 可选补充:如果希望用户关闭浏览器就自动失效会话,可以加上SESSION_EXPIRE_AT_BROWSER_CLOSE = True,不过这个和固定时长的配置二选一就行,看你更倾向哪种安全策略。

二、仅针对Admin后台的精细化配置(不影响前端用户)

如果只想让Admin后台有这个会话控制,不想影响前端普通用户,那我们可以自定义一个中间件来实现:

步骤1:创建中间件文件

在你的应用目录下(比如your_app/middleware.py),写一个自定义中间件:

from django.utils import timezone
from django.conf import settings
from django.contrib.admin import site as admin_site
from django.contrib.auth import logout

class AdminSessionTimeoutMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # 可以在settings里自定义Admin会话超时时间,默认30分钟
        self.admin_session_age = getattr(settings, 'ADMIN_SESSION_COOKIE_AGE', 1800)

    def __call__(self, request):
        # 检查当前请求是否属于Admin后台路径
        if request.path.startswith(admin_site.urls[0]):
            # 仅对已登录的Admin用户生效
            if request.user.is_authenticated and request.user.is_staff:
                last_activity = request.session.get('last_activity')
                current_timestamp = timezone.now().timestamp()

                # 如果超过超时时间,强制登出
                if last_activity and current_timestamp - last_activity > self.admin_session_age:
                    logout(request)
                else:
                    # 更新会话的最后活动时间,实现操作后刷新有效期
                    request.session['last_activity'] = current_timestamp
                    # 标记会话已修改,确保Django保存更新
                    request.session.modified = True

        response = self.get_response(request)
        return response

步骤2:注册中间件

在settings.py的MIDDLEWARE列表里,把这个中间件添加到AuthenticationMiddleware之后(顺序很重要):

MIDDLEWARE = [
    # ... 其他已有的中间件 ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'your_app.middleware.AdminSessionTimeoutMiddleware',  # 替换成你的中间件路径
    # ... 其他已有的中间件 ...
]

步骤3:可选自定义超时时间

要是想单独设置Admin的会话时长,直接在settings.py里加一行就行,不用改中间件代码:

ADMIN_SESSION_COOKIE_AGE = 1200  # 比如改成20分钟,单位秒

这个中间件的逻辑很简单:每次Admin用户发起请求时,都会检查会话的最后活动时间,如果超过设定时长就自动登出;如果没超时,就更新最后活动时间,这样用户每操作一次,会话有效期就会重新开始计算,完美满足你的两个需求~

备注:内容来源于stack exchange,提问作者Germano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:29:29