Django项目中添加ldap登陆认证功能的实现


Posted in Python onApril 04, 2019

最近在开发一个Django项目过程中,碰到了通过ldap认证用户登录的需求。由于之前都是自己写密码加密、用户登录等逻辑,连Django自带的认证模块都没用过,无奈网上关于django配置ldp的资料实在不全。因此,自己摸索了一种简单的实现方式,记录于此。

开发环境

Centos7.2下安装pycharm,并通过X转发至Winodws桌面进行开发

安装pyenv,使用virtualenv 3.6.2 Archives

安装开发过程中需要用到的第三方库,django, mysqlclient等等....这里就不多赘述了

若需参考django开发环境配置和django项目的部署,可以参考我另外一篇文章

python-ldap的安装

python-ldap的安装是最大的坑点。

  1. 使用pip安装python-ldap时,会报缺少ConfigParser库文件的错误,于是先用pip安装ConfigParser。
  2. 但是,python3中ConfigParser改名成了configparser。依旧没法安装,会报No model named ConfigParser。解决方法是到:/root/.pyenv/versions/3.6.2/lib/python3.6目录(这是我的pyenv目录)下,将configparser.py复制一份并改名为ConfigParser.py。
  3. 解决了以上两点后,如果直接使用pip install python-ldap。默认的python-ldap版本会报gcc的编译错误,最后指定版本pip install python-ldap==3.0.0b4解决,这才成功安装上python-ldap依赖。

ldap认证实现思路

如果一个项目的用户登陆要通过ldap,那么这个项目一般就是公司内部项目,例如OA系统,运维平台等。那么,我们可以将用户输入账号、密码信息发给ldap服务器进行认证。如果ldap认证通过,我们去查询数据库中是否已存在此账号的用户,若存在,直接跳转登陆即可,若不存在,则先在数据库中创建此用户,随后跳转登陆。如果ldap认证失败,提示错误信息并返回登陆页即可。有了这样的思路,我们的代码就很简单了。

ldap认证代码 auth.py

初始化连接,bind认证账号密码。如果bind成功,就返回True,若bind报错,就返回False。

import ldap
def auth_user(user, passwd):
  conn = ldap.initialize("ldap://IP:PORT")
  try:
    conn.simple_bind_s(user, passwd)
    return 1
  except:
    return 0

登陆的view代码

拿到form中用户输入的账号、密码。调用User对象的login方法,验证成功,就跳转登陆,否则,就提示错误并返回登陆页面。

def login(request):
  name = request.POST.get('username')
  password = request.POST.get('userpassword')
  user = User.login(name, password)
  if user:
    ...
    return redirect('user:users')
  else:
    context = {}
    context['name'] = name
    context['error'] = '用户名或密码错误'
    return render(request, 'user/login.html', context)

User对象的Login方法代码

login方法提供了登陆验证功能。调用auth_user函数,传入user,password参数,注意用户名前需要添加本地域名Domain:\。

@classmethod
  def login(cls, name, password):
    username = 'Domain\\' + name
    ret = auth_user(username, password)
    # password correct
    if ret:
      try:
        user = User.objects.get(name=name)
        return user
      except ObjectDoesNotExist as e:
        user = User()
        user.name = name
        user.save()
        return user
    # password error
    else:
      return None

怎么样,这就实现了在django中通过ldap验证用户登陆的功能,是不是比在settings里配置ldap来导入用户信息要方便的多?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用ctypes模块调用windowsapi获取系统版本示例
Apr 17 Python
python比较两个列表是否相等的方法
Jul 28 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
python 将大文件切分为多个小文件的实例
Jan 14 Python
详解opencv Python特征检测及K-最近邻匹配
Jan 21 Python
Django REST framework 分页的实现代码
Jun 19 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 Python
python爬取招聘要求等信息实例
Nov 20 Python
java关于string最常出现的面试题整理
Jan 18 Python
python 如何读、写、解析CSV文件
Mar 03 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 #Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 #Python
详解python项目实战:模拟登陆CSDN
Apr 04 #Python
Python实现字符串匹配的KMP算法
Apr 04 #Python
Python GUI编程完整示例
Apr 04 #Python
Python使用sax模块解析XML文件示例
Apr 04 #Python
详解小白之KMP算法及python实现
Apr 04 #Python
You might like
PHP实时显示输出
2008/10/02 PHP
php高级编程-函数-郑阿奇
2011/07/04 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
Python实现的密码强度检测器示例
2017/08/23 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
简述python Scrapy框架
2020/08/17 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
生日寿宴答谢词
2014/01/19 职场文书
开工仪式策划方案
2014/05/23 职场文书
中层干部培训方案
2014/06/16 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL