在企业环境中使用Kerberos认证Django应用
Django 企业内网Kerberos免密登录配置方案
1. 基础环境准备
- 确保Django服务器已接入企业Kerberos域(或能正常访问域控KDC服务器)
- 安装核心依赖包:
python-gssapi(处理Kerberos认证逻辑)、django-auth-kerberos(简化Django集成的工具包,也可自行实现认证逻辑) - 为Django服务创建Kerberos服务主体,格式为
HTTP/你的Django服务器域名@企业Kerberos域,导出对应的keytab文件到服务器,将文件权限设为600,属主改为运行Django的系统用户
2. Django核心配置修改
2.1 替换认证后端
在settings.py中调整认证后端顺序,优先使用Kerberos认证:
AUTHENTICATION_BACKENDS = [ 'django_auth_kerberos.backends.KerberosBackend', # 如需保留LDAP同步用户信息功能,可保留LDAP后端 'django_auth_ldap.backend.LDAPBackend', ]
2.2 配置Kerberos参数
在settings.py中添加Kerberos专属配置:
KRB5_REALM = 'YOUR_COMPANY_DOMAIN.COM' # 替换为企业实际Kerberos域 KRB5_SERVICE_PRINCIPAL = 'HTTP/your-django-server.your-company.com@YOUR_COMPANY_DOMAIN.COM' KRB5_KEYTAB = '/opt/django/service.keytab' # keytab文件的实际路径 KRB5_USERNAME_ATTR = 'sAMAccountName' # 对应AD/LDAP中的用户名属性
2.3 添加认证中间件
将Kerberos中间件加入MIDDLEWARE列表,放在AuthenticationMiddleware之前:
MIDDLEWARE = [ # 其他已有中间件... 'django_auth_kerberos.middleware.KerberosMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', # 其他已有中间件... ]
3. 客户端浏览器配置
确保域内用户的浏览器自动发送Kerberos票据:
- Chrome/Edge:进入
chrome://settings/security,将Django服务器域名添加到「本地Intranet」站点,开启「自动登录到Intranet站点」选项 - Firefox:在
about:config中设置network.negotiate-auth.trusted-uris为Django服务器域名
4. 用户信息同步(可选)
如果需要从LDAP同步用户邮箱、部门等额外信息,可结合django-auth-ldap配置,Kerberos认证通过后自动拉取LDAP数据:
# settings.py中LDAP配置示例 AUTH_LDAP_SERVER_URI = 'ldap://dc.your-company.com' AUTH_LDAP_BIND_DN = 'CN=LDAP绑定账号,OU=服务账号,DC=your-company,DC=com' AUTH_LDAP_BIND_PASSWORD = '绑定账号密码' AUTH_LDAP_USER_SEARCH = LDAPSearch( 'OU=用户组,DC=your-company,DC=com', ldap.SCOPE_SUBTREE, '(sAMAccountName=%(user)s)' ) AUTH_LDAP_USER_ATTR_MAP = { 'first_name': 'givenName', 'last_name': 'sn', 'email': 'mail' }
5. 测试与调试
- 启动Django服务,用域内已登录的电脑访问应用,应直接进入登录状态
- 若认证失败,检查Kerberos日志(Linux为
/var/log/krb5kdc.log,Windows查看事件查看器),重点排查keytab权限、服务主体是否匹配 - 可在服务器上用
kinit命令验证服务主体有效性:kinit -kt /opt/django/service.keytab HTTP/your-django-server.your-company.com@YOUR_COMPANY_DOMAIN.COM
内容的提问来源于stack exchange,提问作者CodeComet
相关产品推荐
相关产品推荐

