本文详细介绍了django-auth-ldap的使用方法,参数含义,并提供了示例代码

版本说明

  • Django==2.2
  • django-auth-ldap==1.7.0

集成过程

Django集成LDAP认证有现成的django-auth-ldap模块可以使用,本文也主要以这个模块的使用为主,先安装模块

pip install django-auth-ldap

然后在setting.py全局配置文件中添加如下内容就可以正常使用了:

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType # Baseline configuration.
AUTH_LDAP_SERVER_URI = 'ldap://ldap.ops-coffee.cn' AUTH_LDAP_BIND_DN = 'uid=authz,ou=Public,dc=ops-coffee,dc=cn'
AUTH_LDAP_BIND_PASSWORD = 'CzfdX629K7' AUTH_LDAP_USER_SEARCH = LDAPSearch(
'ou=People,dc=ops-coffee,dc=cn',
ldap.SCOPE_SUBTREE,
'(uid=%(user)s)',
)
# Or:
# AUTH_LDAP_USER_DN_TEMPLATE = 'uid=%(user)s,ou=People,dc=ops-coffee,dc=cn' AUTH_LDAP_USER_ATTR_MAP = {
'first_name': 'cn',
'last_name': 'sn',
'email': 'mail',
} AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
)

这里详细解释下上边配置的含义:

AUTH_LDAP_SERVER_URI: LDAP服务器的地址

AUTH_LDAP_BIND_DN: 一个完整的用户DN,用来登录LDAP服务器验证用户输入的账号密码信息是否正确

AUTH_LDAP_BIND_PASSWORD: BIND_DN用户的密码,这里我们简单说明下LDAP的认证逻辑以便更好的理解为啥需要这两个配置

Django使用AUTH_LDAP_BIND_DNAUTH_LDAP_BIND_PASSWORD作为用户名和密码登陆LDAP服务器,根据AUTH_LDAP_USER_SEARCH指定的查询规则来查找用户输入的属性(即username)的值有没有,如果查找的条数为0或者大于1,则返回错误,如果查找的条数等于1,则使用查找到的这个条目的DN和用户输入的密码进行匹配验证,成功则返回成功允许登录,失败则不允许登录

AUTH_LDAP_USER_SEARCH: 可通过LDAP登录的用户的范围,如上配置会去ou=People,dc=ops-coffee,dc=cn下搜索用户是否存在

其中(uid=%(user)s)'指明了作为Django的username所对应的LDAP的属性,这里为LDAP用户的uid属性作为Django的username

以上配置是在一个OU下查找用户,当需要在多个OU下搜索用户时用如下配置:

from django_auth_ldap.config import LDAPSearch, LDAPSearchUnion

AUTH_LDAP_USER_SEARCH = LDAPSearchUnion(
LDAPSearch(
'ou=Public,dc=ops-coffee,dc=cn',
ldap.SCOPE_SUBTREE,
'(uid=%(user)s)'
),
LDAPSearch(
'ou=PeoPle,dc=ops-coffee,dc=cn',
ldap.SCOPE_SUBTREE,
'(uid=%(user)s)'
),
)

AUTH_LDAP_USER_ATTR_MAP: LDAP中的用户属性跟Django后台用户属性的对应关系,当用户第一次登录且验证成功后会将LDAP中对应的用户属性写入到Django的User表中

AUTHENTICATION_BACKENDS: 配置Django的后端认证列表

当Django调用auth.authenticate方法进行验证时,Django将尝试AUTHENTICATION_BACKENDS元组中指定的所有认证后端。如果第一个认证方法失败了,Django将会继续尝试下一个,直到所有认证方式都尝试完成

Django默认的认证后端是django.contrib.auth.backends.ModelBackend,如上配置我们添加了ldap的认证到AUTHENTICATION_BACKENDS中,那么Django在登录的时候就会先去LDAP服务器验证用户,验证失败后再去查询本地数据库的User表进行验证,如果只希望Django验证LDAP不验证本地数据库的话去掉AUTHENTICATION_BACKENDS中的ModelBackend配置即可

其他几个django-auth-ldap的全局配置参数解释如下:

AUTH_LDAP_ALWAYS_UPDATE_USER: 是否同步LDAP的修改,默认为True,即当LDAP中用户的属性修改后用户通过LDAP系统认证时自动同步更新到Django的User表中,如果设置为False则不自动更新

AUTH_LDAP_CACHE_TIMEOUT: 设置LDAP认证缓存的时间

登录验证

上边的配置没有问题后就可以通过LDAP系统账号进行登录操作了,默认登陆逻辑及前端登录代码均无需修改

如果你在调试过程中遇到问题,我准备了一份demo源码可供参考,公众号后台回复09获取地址

高级配置

所谓高级配置这里主要是说明下django-auth-ldap中组相关的配置,这需要对LDAP的组有一定的概念,为了方便理解,接下来我们以实际的例子来说明

假如我们有三个组overmind、kerrigan、admin,配置如下:

# ldapsearch -LLL -x -D "uid=authz,ou=Public,dc=ops-coffee,dc=cn" -w "CzfdX629K7" -b cn=overmind,ou=Group,dc=ops-coffee,dc=cn
dn: cn=overmind,ou=Group,dc=ops-coffee,dc=cn
cn: overmind
member: uid=sre,ou=People,dc=ops-coffee,dc=cn
objectClass: groupOfNames
objectClass: top
# ldapsearch -LLL -x -D "uid=authz,ou=Public,dc=ops-coffee,dc=cn" -w "CzfdX629K7" -b cn=kerrigan,ou=Group,dc=ops-coffee,dc=cn
dn: cn=kerrigan,ou=Group,dc=ops-coffee,dc=cn
cn: kerrigan
objectClass: groupOfNames
objectClass: top
member: uid=u1,ou=Public,dc=ops-coffee,dc=cn
member: uid=u2,ou=People,dc=ops-coffee,dc=cn
# ldapsearch -LLL -x -D "uid=authz,ou=Public,dc=ops-coffee,dc=cn" -w "CzfdX629K7" -b cn=admin,ou=Group,dc=ops-coffee,dc=cn
dn: cn=admin,ou=Group,dc=ops-coffee,dc=cn
cn: admin
member: uid=u3,ou=Admin,dc=ops-coffee,dc=cn
objectClass: groupOfNames
objectClass: top

我们需要实现Django集成LDAP认证,且不允许隶属于kerrigan分组的用户登录系统,如果用户隶属于admin分组,则需要在登录Django时给设置为管理员,接下来的配置将会解释如何实现该需求

django-auth-ldap中与group有关的配置:

AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
'ou=Group,dc=ops-coffee,dc=cn',
ldap.SCOPE_SUBTREE,
'(objectClass=groupOfNames)',
)
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr='cn') # Simple group restrictions
# AUTH_LDAP_REQUIRE_GROUP = 'cn=overmind,ou=Group,dc=ops-coffee,dc=cn'
AUTH_LDAP_DENY_GROUP = 'cn=kerrigan,ou=Group,dc=ops-coffee,dc=cn' AUTH_LDAP_USER_FLAGS_BY_GROUP = {
'is_superuser': 'cn=admin,ou=Group,dc=ops-coffee,dc=cn',
}

以上配置的详细解释如下:

AUTH_LDAP_GROUP_SEARCH: 搜索某个ou下的信息,与AUTH_LDAP_USER_SEARCH参数类似,这里的ou一般指group,例如ou=Group,dc=ops-coffee,dc=cn的组目录

AUTH_LDAP_GROUP_TYPE: 返回的组的类型,组DN的第一个属性值,例如组DNcn=overmind,ou=Group,dc=ops-coffee,dc=cn,那么这里为cn

AUTH_LDAP_REQUIRE_GROUP: 设置允许哪些组成员登录,如果我们只允许overmind组的成员可以登录系统的话这里可以设置

AUTH_LDAP_REQUIRE_GROUP = 'cn=overmind,ou=Group,dc=ops-coffee,dc=cn'

AUTH_LDAP_DENY_GROUP: 设置拒绝哪些组成员登录,如果我们不允许kerrigan组的成员可以登录系统的话这里可以设置

AUTH_LDAP_DENY_GROUP = 'cn=kerrigan,ou=Group,dc=ops-coffee,dc=cn'

当我们同时设置了用户既属于overmind组又属于kerrigan组,也就是这个用户即设置了允许登录,又设置了拒绝登录,那么以拒绝登录为准,用户无法登录

AUTH_LDAP_USER_FLAGS_BY_GROUP: 根据LDAP的group设置Django用户的额外属性,例如我们想要设置LDAP中admin组具有Django中超级管理员的权限,除了在Django中手动设置外,还可以直接在setting中配置AUTH_LDAP_USER_FLAGS_BY_GROUP

AUTH_LDAP_USER_FLAGS_BY_GROUP = {
'is_superuser': 'cn=admin,ou=Group,dc=ops-coffee,dc=cn',
}

当admin组用户登录的时候就会自动给用户的is_superuser属性设置为True

至此我们对django-auth-ldap有了一个全面的了解,在实际项目集成中可以做到游刃有余,如有问题可以参考我github的代码

踩坑记录

windowns 10下安装python-ldapdjango-auth-ldap报错:

c:\users\ops-coffee\appdata\local\temp\pip-install-sec1o036\python-ldap\modules\constants.h(7): fatal error C1083: Cannot open include file: 'lber.h': No such file or directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2

这个报错需要手动安装下whl文件,具体方法为:

先在这个网站https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap下载对应版本的python-ldap的whl文件

然后使用pip命令安装whl,注意文件路径要正确

D:\demo\openldap>python -m pip install python_ldap-3.2.0-cp36-cp36m-win_amd64.whl
Processing d:\demo\openldap\python_ldap-3.2.0-cp36-cp36m-win_amd64.whl
Requirement already satisfied: pyasn1>=0.3.7 in c:\python36\lib\site-packages (from python-ldap==3.2.0) (0.4.2)
Requirement already satisfied: pyasn1-modules>=0.1.5 in c:\python36\lib\site-packages (from python-ldap==3.2.0) (0.2.4)
Installing collected packages: python-ldap
Successfully installed python-ldap-3.2.0

相关文章推荐阅读:

Django集成OpenLDAP认证的更多相关文章

  1. LDAP落地实战(三):GitLab集成OpenLDAP认证

    上一篇文章介绍了svn集成OpenLDAP认证,版本控制除了svn外,git目前也被越来越多的开发者所喜爱,本文将介绍GitLab如何集成openldap实现账号认证 GitLab集成OpenLDAP ...

  2. LDAP落地实战(四):Jenkins集成OpenLDAP认证

    前几篇分文章分别介绍了OpenLDAP的部署管理和维护以及svn.git的接入,今天我们再下一城接入jenkins. 前情提要:LDAP系列文章 LDAP落地实战(一):OpenLDAP部署及管理维护 ...

  3. LDAP落地实战(二):SVN集成OpenLDAP认证

    上一篇文章我们介绍了LDAP的部署以及管理维护,那么如何接入LDAP实现账号统一认证呢?这篇文章将带你完成svn的接入验证 subversion集成OpenLDAP认证 系统环境:debian8.4 ...

  4. Django集成百度富文本编辑器uEditor

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 首先从ueEditor官网下载最新版本的包, ...

  5. django集成celery之callback方式link_error和on_failure

    在使用django集成celery进行了异步调度任务之后,如果想对失败的任务进行跟踪或者告警,怎么做? 这里提供一个亲测的方法. 1.任务callback 假如你想在任务执行失败的时候,打印错误信息并 ...

  6. Ocelot简易教程(五)之集成IdentityServer认证以及授权

    Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocelot简易教程(二)之快速开始1 Ocelot简易教程(二)之快速开始2 Ocelot简易教程(三)之主要特性及路由详解 ...

  7. Django组件之认证系统

      Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...

  8. Django Rest Framework(认证、权限、限制访问频率)

    阅读原文Django Rest Framework(认证.权限.限制访问频率) django_rest_framework doc django_redis cache doc

  9. django的forms认证组件

    django的forms认证组件 每个网站的注册界面都需要有相应的"认证"功能,比如说认证注册页面的用户名是否已被注册,二次输入的密码是否一致以及认证用户输入的用户名.邮箱.手机号 ...

随机推荐

  1. (十)创建ROS消息和ROS服务

    ROS总教程(中文版) 110.创建ROS消息和ROS服务

  2. spring mvc controller中的参数验证机制(二)

    这里我们介绍以下自定义的校验器的简单的使用示例 一.包结构和主要文件 二.代码 1.自定义注解文件MyConstraint package com.knyel.validator; import ja ...

  3. CMD命令启动和关闭SQL服务

    1.开启:net start mssqlserver 2.关闭:net stop mssqlserver

  4. java多线程系列11 juc包下的队列

    队列分为两类  阻塞队列 BlockingQueue提供如下两个支持阻塞的方法:   (1)put(E e): 尝试把e元素放如BlockingQueue中,如果该队列的元素已满,则阻塞该线程.   ...

  5. tomcat的缺少tcnative-1.dll的解决

    tomcat启动出现如下问题: The APR based Apache Tomcat Native library which allows optimal performance in produ ...

  6. Java输入输出流详解

    通过数据流.序列化和文件系统提供系统输入和输出. Java把这些不同来源和目标的数据都统一抽象为数据流.Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为 ...

  7. 【接口时序】3、UART串口收发的原理与Verilog实现

    一.软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45- ...

  8. 方向导数,梯度和梯度下降之BGD,SGD

    方向导数和梯度的直观理解,from知乎-马同学: https://www.zhihu.com/question/36301367 BGD,SGD: https://www.cnblogs.com/gu ...

  9. poj1149构图题

     引题解: 这道题目的大意是这样的:⦁ 有 M 个猪圈(M ≤ 1000),每个猪圈里初始时有若干头猪.⦁ 一开始所有猪圈都是关闭的.⦁ 依次来了 N 个顾客(N ≤ 100),每个顾客分别会打开指定 ...

  10. 从Redis生成数据表主键标识

    对于MySql的全局ID(主键),我们一般采用自增整数列.程序生成GUID.单独的表作为ID生成器,这几种方案各有优劣,最终效率都不能说十分理想(尤其海量数据下),其实通过Redis的INCR可以很方 ...