Django实现科室与用户双重登录系统的方案咨询
Django 双层登录系统实现方案
标准落地路径
完全匹配当前需求的实现不需要修改Django原生auth框架核心逻辑,靠session分层存储+中间件拦截即可实现,逻辑清晰无额外依赖:
- 拆分两层认证的session存储规则
不要在第一层病区账号校验通过后就调用Django自带的login()方法写入正式登录态。单独在request.session里存独立的第一层校验标识,比如ward_auth_pass,字段内容存校验通过的病区ID、校验时间戳,给这个标识单独设有效期(比如30分钟无操作自动失效)。
第一层登录视图参考逻辑:def ward_login_view(request): # 已通过第一层校验的直接跳转个人登录页 if request.session.get('ward_auth_pass'): return redirect('personal_login') if request.method == "POST": form = WardLoginForm(request.POST) if form.is_valid(): ward_id = form.cleaned_data['ward_id'] input_pwd = form.cleaned_data['password'] # 校验对应病区的通用账号密码 if Ward.objects.filter(id=ward_id, common_pwd=input_pwd).exists(): request.session['ward_auth_pass'] = { "ward_id": ward_id, "verify_ts": timezone.now().timestamp() } return redirect('personal_login') else: form = WardLoginForm() return render(request, "ward_login.html", {"form": form}) - 增加全局前置校验中间件
写一个轻量中间件,拦截除病区登录页、静态资源路径之外的所有请求:首先检查session里有没有合法的ward_auth_pass标识,没有就直接重定向回病区登录页;如果已经通过第一层校验,再检查是否有Django原生auth记录的个人账号登录态,没有就跳转个人登录页。
第二层个人账号登录时,除了校验护士个人的账号密码正确性,必须额外加一层校验:当前护士账号关联的病区ID,必须和ward_auth_pass里存的病区ID一致,避免跨病区登录绕过。校验全部通过后再调用login()写入正式个人登录态。 - 配套退出/过期逻辑
用户主动退出时直接清空全量session,跳回第一层登录页;如果第一层校验标识过期,就算个人登录态还在,也要同步清空个人登录态,强制回到第一层重新校验。
更优替代设计
原需求里的「病区共用通用账号」存在明显安全隐患,实际落地可以根据业务本质做优化,不改变核心使用流程但安全性提升很多:
- 去掉静态共用密码,改设备绑定校验
护士站的工作终端基本都是固定的,不需要额外记忆共用密码:给每个病区的工作终端做绑定,第一次激活时由护士长输入管理密码,把加密的设备标识存在浏览器本地存储里。用户打开系统选完病区,系统自动校验当前设备是否属于该病区绑定的合法设备,校验通过直接进个人登录页,既满足“必须在本病区范围内才能登录系统”的核心要求,又解决了共用密码容易泄露、轮转/离职人员知晓密码后存在访问风险的问题。 - 如果必须保留密码环节,改用动态日更密码
不要给病区设置长期固定的通用密码,由系统每天凌晨自动生成每个病区的当日通用密码,推送给当天的当班护士长,密码24小时自动失效,就算泄露影响范围也可控。 - 所有操作日志、权限校验全部绑定个人账号
第一层校验只做访问范围拦截,所有业务操作的权限判断、操作留痕必须绑定到第二层登录的个人护士账号,出现操作问题可以精准追溯到具体人,不要因为有第一层校验就放松个人层的权限管控。
内容的提问来源于stack exchange,提问作者IbbyR
相关产品推荐
相关产品推荐

