首先先使用ldap3测试ldap服务是否正常

我们先要拿到dc的数据,以及连接ldap的密码,还有搜索的字段(search_filter), 一般来说search_filter 这个是从负责ldap运维的同事获取的。attributes 这个是获取哪些字段的数据,犹如mysql 语句的select xx,xxx , 如果吧attributes设置为ALL_ATTRIBUTES,那么就是获取所有字段数据。

  1. search_base='ou=xx,dc=xxx,dc=com' # ldap运维同事提供
  2. ldaphost = ("ldap://192.168.2.1:389")
  3. password="11111" # 这个是管理员的密码
  4. search_filter="(objectclass=*)"
  5. from ldap3 import Server, Connection, ALL, SUBTREE, ServerPool,ALL_ATTRIBUTES
  6. s = Server(ldaphost)
  7. conn = Connection(s,password=password)
  8. conn.open()
  9. conn.bind()
  10. True # 执行完bind方法后,返回true说明正确,如果是false的话,需要检查你Connection参数是否正确
  11. res = conn.search(search_base=search_base,search_filter=search_filter,search_scope=SUBTREE,attributes = ALL_ATTRIBUTES) # 如果res不是false说明search方法执行成功啦。否则检查传入的参数是否正确

如果res返回的是非false,而是一堆ldap数据,那么就说明ldap连接是正常的,那么下面开始使用ldap3联合django做认证吧

如果上述步骤没有错误的话,那么请走下面这一步

  1. >>> user="cn=oliaojiaf,ou=People,dc=xxx,dc=com," # 错误写法
  2. >>> user='cn=oliaojiaf,dc=xxx,dc=com,ou=People,' # 错误写法
  3. >>> user='cn=oliaojiaf,ou=People,dc=xxx,dc=com' #正确的写法
  4. >>> c = ldap3.Connection(ldap3.Server("ldap://192.168.2.1:389",get_info=ldap3.NONE,allowed_referral_hosts=[("*", True)],),user=user,password="ljf,xxx",auto_bind=ldap3.AUTO_BIND_NO_TLS,raise_exceptions=True,)
  5. >>> c.open()
  6. >>> c.bind()
  7. True

如果上面也是没有问题的话,那么就可以配置django+ldap认证了

python3 django ldap认证

咱们使用django-python3-ldap,所以按照安装配置启动三步走的方法来。

1.安装django-python3-ldap模块

  1. pip install django-python3-ldap

2.配置

django-python3-ldap 模块 配置方法可以看下官网,官网

  1. AUTHENTICATION_BACKENDS = (
  2. "django_python3_ldap.auth.LDAPBackend", #配置为先使用LDAP认证,如通过认证则不再使用后面的认证方式
  3. #'django.contrib.auth.backends.ModelBackend',
  4. )
  5. LDAP_AUTH_URL = 'ldap://192.168.2.1:389'
  6. LDAP_AUTH_USE_TLS = False
  7. LDAP_AUTH_SEARCH_BASE = 'ou=People,dc=xxx,dc=com'
  8. LDAP_AUTH_OBJECT_CLASS = "inetOrgPerson"
  9. LDAP_AUTH_USER_FIELDS = {
  10. "username": "sn",
  11. "last_name": "sn",
  12. "first_name": "sn",
  13. "email": "mail"
  14. }
  15. LDAP_AUTH_CLEAN_USER_DATA = "django_python3_ldap.utils.clean_user_data"
  16. LDAP_AUTH_SYNC_USER_RELATIONS = "django_python3_ldap.utils.sync_user_relations"
  17. LDAP_AUTH_FORMAT_SEARCH_FILTERS = "django_python3_ldap.utils.format_search_filters"
  18. LDAP_AUTH_FORMAT_USERNAME = "django_python3_ldap.utils.format_username_openldap"

3.修改django_python3_ldap.ldap的代码。

这一步我自己反复测试,发现这个包发给ldap-server的数据格式不对,导致ldap-server返回的就是invalidCredentials,所以我们需要修改它的代码,使其符合ldap-server要求的数据格式,这个怎么修改就看自己的需求了,没有标准答案。

修改的代码相对路径是 安装django_python3_ldap的lib路径/django_python3_ldap/ldap ,例如我的是在 /usr/local/python356/lib/python3.5/site-packages/django_python3_ldap/ldap.py ,在 connection 的方法里面 ,在148行开始

  1. username = username.replace("sn","cn") # 自己添加的代码

然后在183行注释掉源代码,添加自己的代码

  1. try:
  2. # c.rebind(
  3. # user=format_username({User.USERNAME_FIELD: settings.LDAP_AUTH_CONNECTION_USERNAME}),
  4. # password=settings.LDAP_AUTH_CONNECTION_PASSWORD,
  5. # )
  6. c.open() # 自己添加的代码
  7. if not c.bind(): #bind 为false,说明认证失败,需要抛出异常
  8. raise LDAPException # 自己添加的代码,bind返回true的话,说明用户信息认证成功
  9. except LDAPException as ex:

之所以需要注释掉上面的代码,是因为rebind是借助已有的连接再次认证下,这次认证的是我们在settings配置的用户名密码,由于我司运维同时给的ldap连接信息里没有CONNECTION_USERNAME,所以总是认证通过不了,所以我这里就需要注释了。

然后重启djanog,发现就能认证成功了。

python3 使用ldap3来作为django认证后台的更多相关文章

  1. django用户认证系统——自定义认证后台8

    Django auth 应用默认支持用户名(username)进行登录.但是在实践中,网站可能还需要邮箱.手机号.身份证号等进行登录,这就需要我们自己写一个认证后台,用于验证用户输入的用户信息是否正确 ...

  2. Django Admin后台管理功能使用+二次开发

    一  使用环境 开发系统: windows IDE: pycharm 数据库: msyql,navicat 编程语言: python3.7  (Windows x86-64 executable in ...

  3. django认证系统 Authentication

    Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. Django的认证系统包含了身份验证和权限管理两部分.简单地说,身份验证用于核实某个用户是否合法,权限管理 ...

  4. django 认证系统--3

    WEB request中的认证 django使用sessions和middleware和reqeust对象联系在一起 它们通过给每一个reqeust请求添加一个request.user属性来代表当前用 ...

  5. django 认证系统--2

    使用django的认证系统 User 对象 User是认证系统的核心.典型代表是用户和你的站点进行交互还有限制访问.注册用户等等.django认证框架中,只存在一个User类,像'superuser' ...

  6. Django认证系统并不鸡肋反而很重要

    在使用django-admin startproject创建项目后,Django就默认安装了一个采用session实现的认证系统.这是Django相比于其他框架的一大特点:自带认证系统,开箱即用.有人 ...

  7. 自定义Django认证系统的技术方案

    Django已经提供了开箱即用的认证系统,但是可能并不满足我们的个性化需求.自定义认证系统需要知道哪些地方可以扩展,哪些地方可以替换.本文就来介绍自定义Django认证系统的相关技术细节. 自定义认证 ...

  8. Django认证系统auth认证

    使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...

  9. django 认证模块auth,表单组件form

    django认证系统(auth): 1.首先我们在新窗口中打开一个django项目,之后点击,

随机推荐

  1. Java 深复制和浅复制

    浅复制是指复制对象时仅仅复制对象本身(包括对象中的基本变量),而不复制对象包含的引用指向的对象.深复制不仅复制对象本身,而且复制对象包含的引用指向的对象. 复制对象时需要调用Object类的clone ...

  2. js实现60s倒计时效果

    适用于获取验证码等其他场景,下面代码直接粘贴句可以使用 // 60s获取验证码的js与html var timer = null; var count = 60; $('.box>button' ...

  3. 定位bug的方法总结

    把问题聚焦到某一个点上,而不是焦躁的瞎搞,这样效率极低 1,看改动的地方 2,看文档:官方文档或者接口文档. 3,google不到的话,也试试百度中文搜索. 4,看格式反常的地方 5,反思 反常的地方 ...

  4. vue-cli webpack2项目打包优化

    减小文件搜索范围 配置 resolve.modules Webpack的resolve.modules配置模块库(即 node_modules)所在的位置,在 js 里出现 import 'vue' ...

  5. 邮轮ERP系统

    近两年一直做邮轮旅游方面的系统开发,最近有点时间,就花了两三个月,开发了一套邮轮ERP. 感兴趣的同学可以给我留言(904308112@qq.com),一起交流学习.

  6. Deepin 15.4 编译安装 LNMP(PHP 5.6.31 + Nginx 1.12.1 + MySQL 5.6.36)

    先查看先前的文章:Ubuntu 14 编译安装 PHP 5.4.45 + Nginx 1.4.7 + MySQL 5.6.26 笔记 编译 Nginx #安装依赖库 sudo apt-get -y i ...

  7. delphi 设置多屏幕

    //poScreenCenter时,窗体会显示到主显示器的中央 MainForm.Position := poScreenCenter; function TGAEAMainForm.GetWorkA ...

  8. MiniUI破解方法

    解决JQuery MiniUI前端库到期alert弹窗 MINIUI的到期提示是通过JS的Alert 方法弹出的. 那么我们可以不可以截获所有Alert方法,过滤文本.然后….你们懂得 我们只需要在页 ...

  9. 利用ImageJ快速调整连续切片的对比度

    图像处理过程中,各种来源的数据都有,有些情况下,我们拿到的连续切片在桌面系统的常规浏览器下看几乎全黑或者整体偏暗,这时大家就需要来调整图像的对比度,其实常规的三维可视化软件读取这类数据前也不需要进行特 ...

  10. ionic android升级检查

    https://www.cnblogs.com/zxj159/p/4421578.html 坑: 放到cordova.file.DataDirectory下载异常? 只好cordova.file.ex ...