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异常处理总结
Aug 15 Python
pygame播放音乐的方法
May 19 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
flask实现验证码并验证功能
Dec 05 Python
python使用多线程+socket实现端口扫描
May 28 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
Python定义一个Actor任务
Jul 29 Python
Python创建自己的加密货币的示例
Mar 01 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
python编程项目中线上问题排查与解决
Nov 01 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中var_export与var_dump的区别分析
2010/08/21 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
CI框架中$this->load->library()用法分析
2016/05/18 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
Python之多进程与多线程的使用
2021/02/23 Python
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
电大自我鉴定
2013/10/27 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
师德培训心得体会2016
2016/01/09 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python