Django 如何用 REMOTE_USER 接入 IIS、CAS 等外部单点登录

发布时间:2026/9/13 23:43:22

Django 如何用 REMOTE_USER 接入 IIS、CAS 等外部单点登录 Django 如何用 REMOTE_USER 接入 IIS、CAS 等外部单点登录【免费下载链接】djangoThe Web framework for perfectionists with deadlines.项目地址: https://gitcode.com/GitHub_Trending/dj/django内网应用经常把认证工作交给前置的 Web 服务器或单点登录网关如 IIS Integrated Windows Authentication、Apache mod_authnz_ldap、CAS、WebAuth、mod_auth_sspi等Django 本身不处理密码只接收认证后的用户名。这类方案下服务器会把认证后的用户名放入REMOTE_USERWSGI 部署中它出现在request.META的REMOTE_USER键ASGI 部署中则通过 HTTP 头传递对应request.META的HTTP_REMOTE_USER键。Django 提供RemoteUserMiddleware或PersistentRemoteUserMiddleware与RemoteUserBackend来处理这个值实现自动登录。官方操作文档见 docs/howto/auth-remote-user.txt后端 API 说明见 docs/ref/contrib/auth.txt。基本配置两步改动都写在项目settings中。第一步添加中间件。把django.contrib.auth.middleware.RemoteUserMiddleware加入MIDDLEWARE且必须放在django.contrib.auth.middleware.AuthenticationMiddleware之后MIDDLEWARE [ ..., django.contrib.auth.middleware.AuthenticationMiddleware, django.contrib.auth.middleware.RemoteUserMiddleware, ..., ]这个顺序有硬性要求如果AuthenticationMiddleware没在前面即request上还没有user属性RemoteUserMiddleware会抛出ImproperlyConfigured提示在 MIDDLEWARE 中把AuthenticationMiddleware插到它前面。第二步替换认证后端。在AUTHENTICATION_BACKENDS中用RemoteUserBackend替换ModelBackendAUTHENTICATION_BACKENDS [ django.contrib.auth.backends.RemoteUserBackend, ]这样配置后RemoteUserMiddleware会从request.META[REMOTE_USER]ASGI 下为request.META[HTTP_REMOTE_USER]取出用户名通过RemoteUserBackend认证并自动登录该用户。RemoteUserBackend继承自ModelBackend所以权限检查逻辑has_perm、get_all_permissions等与默认后端一致。默认行为有两点要注意create_unknown_user默认为True数据库中不存在的用户名会被自动创建为User对象is_activeFalse的用户不允许认证。如需放行非激活用户改用django.contrib.auth.backends.AllowAllUsersRemoteUserBackend。保留 admin 登录通道的可选方案只配置RemoteUserBackend时默认ModelBackend被禁用意味着如果某次请求没有REMOTE_USER值用户无法登录——包括通过 Django admin 界面登录。如果还需要保留密码登录作为后备把两个后端都放进列表即可AUTHENTICATION_BACKENDS [ django.contrib.auth.backends.RemoteUserBackend, django.contrib.auth.backends.ModelBackend, ]文档明确说明当REMOTE_USER不存在时回退到ModelBackend可以解决无法登录 admin 的问题。另外要清楚边界contrib.admin的用户管理界面和createsuperuser命令操作的是数据库里存储的用户与AUTHENTICATION_BACKENDS无关它们不会和 remote user 流程联动。使用自定义 HTTP 头可选分支如果你的认证机制传递的不是REMOTE_USER而是自定义 HTTP 头可以子类化RemoteUserMiddleware并设置header属性为对应的request.META键。例如文档中的例子放在mysite/middleware.pyfrom django.contrib.auth.middleware import RemoteUserMiddleware class CustomHeaderRemoteUserMiddleware(RemoteUserMiddleware): header HTTP_AUTHUSER然后在MIDDLEWARE中用这个自定义中间件替换RemoteUserMiddleware。这里有一条必须遵守的安全约束文档以 warning 形式强调RemoteUserMiddleware绝不能部署在客户端可以自己提供该头的配置中。必须确保 Web 服务器或反向代理基于认证检查结果来设置或剥离该头绝不允许终端用户提交伪造的头值。由于X-Auth-User和X-Auth_User这类头在request.META中都会归一化为HTTP_X_AUTH_USER还要确认 Web 服务器不允许用下划线替代连字符来伪造头。两个环境的差异WSGI默认配置header REMOTE_USER下上述警告不适用因为request.META中不以HTTP_开头的键只能由 WSGI 服务器设置HTTP 请求头无法直接写入ASGI所有配置下该警告都适用因为 ASGI 没有等价于 WSGI environ 的可信值通道。ASGI 部署使用此中间件时必须配合文档所述的反向代理。只在登录页做外部认证PersistentRemoteUserMiddlewareRemoteUserMiddleware假设每个已认证请求都携带REMOTE_USER。这在 Basic HTTP Authhtpasswd之类下是合理的但对 NegotiateGSSAPI/Kerberos这类开销较大的认证方式前端服务器通常只对一两个登录 URL 启用认证登录成功后由应用自己维持会话。PersistentRemoteUserMiddleware正是为这种场景设计的它会保持认证会话有效直到用户显式登出即使请求中找不到request.META键也不会强制注销其实现上就是把force_logout_if_no_header设为False。它可以在上面的配置中作为RemoteUserMiddleware的直接替换使用中间件位置与后端配置不变。验证接入是否生效仓库自带的测试 tests/auth_tests/test_remote_user.py 展示了核对方式可作为验证思路向视图发起不带REMOTE_USER的请求确认response.context[user].is_anonymous为True且User.objects.count()不增加未提供用户名时不会创建用户带上REMOTE_USER头再次请求确认request.user已认证为对应用户且默认情况下新用户名会在数据库中被自动创建。测试中 WSGI 客户端通过 environ 直接传入REMOTE_USER值ASGI 客户端则通过headers传递——这与上文两种环境下request.META键名不同的说明一致。生产环境则应由你的 Web 服务器IIS、Apache 模块等在认证后注入该值Django 侧只负责消费。需要更多控制时若默认行为不够用例如用户名需要清洗 LDAP DN、认证后要按外部目录属性设置用户组可以继承RemoteUserBackend并重写clean_username(username)和configure_user(request, user, createdTrue)等方法configure_user在用户取出或创建后立即调用created参数可区分是首次创建还是同步已有用户适合做本地与外部系统的属性同步如按 LDAP 属性设置用户组。这些方法的语义见 docs/ref/contrib/auth.txt 中RemoteUserBackend一节自定义后端思路在 docs/howto/auth-remote-user.txt 中也有说明。限制与边界认证的最终控制权在前端用户名被认为是可信的Django 不校验密码。因此头防伪造是部署侧的硬前提is_activeFalse的用户默认被拒绝用AllowAllUsersRemoteUserBackend放行是显式选择admin 界面与createsuperuser不感知 remote user 流程它们管理的是数据库用户ASGI 部署必须走反向代理注入/剥离认证头不能用默认配置直接暴露。【免费下载链接】djangoThe Web framework for perfectionists with deadlines.项目地址: https://gitcode.com/GitHub_Trending/dj/django创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/13 23:38:22

基于STM32的水培智能监控系统设计与实战

1. 为什么水培系统需要“智能监控”,而不是靠人盯?我第一次在朋友家阳台看到那套水培装置时,第一反应是:这不就是个带水泵的透明盒子?营养液循环、LED灯定时开关、温度计贴在桶壁上——看起来挺精致,但实际…

2026/9/14 0:33:27

STM32CubeProgrammer安装避坑指南:AI+MCU烧录环境精准配置

1. 这不是“点下一步就完事”的安装,而是嵌入式AI开发链路的第一道硬门槛 你搜“STM32CubeProgrammer 下载”,页面跳出一堆绿色图标、蓝色按钮和“官方下载”字样,点开exe双击、勾选路径、点完成——看起来五分钟搞定。但如果你正走在“嵌入式…

2026/9/14 0:28:25

2026年教育AI工具测评:9款提升教学效率的实用推荐

1. 2026年继续教育行业的技术变革背景2026年的继续教育领域正经历着前所未有的数字化转型浪潮。根据行业调研数据显示,超过87%的培训机构已将AI技术纳入教学体系,但同时也面临着AI工具使用率低下的普遍问题——平均AI工具实际使用率不足35%,大…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/13 11:18:28

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码