如何限制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
相关产品推荐
相关产品推荐

