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中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
Python中异常重试的解决方案详解
May 05 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
Python2和Python3.6环境解决共存问题
Nov 09 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
详解Python3序列赋值、序列解包
May 14 Python
python 经典数字滤波实例
Dec 16 Python
python处理RSTP视频流过程解析
Jan 11 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
如何用PyPy让你的Python代码运行得更快
Dec 02 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 skymvc 一款轻量、简单的php
2011/06/28 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
js简单实现图片延迟加载的方法
2016/07/19 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
wxpython 学习笔记 第一天
2009/02/09 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python实现输入数字的连续加减方法
2018/06/22 Python
详解Python3的TFTP文件传输
2018/06/26 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
深入理解Python异常处理的哲学
2019/02/01 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
社区平安建设方案
2014/05/25 职场文书
涨价通知
2015/04/23 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
python图片灰度化处理的几种方法
2021/06/23 Python
webpack的移动端适配方案小结
2021/07/25 Javascript
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS