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模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
Python中http请求方法库汇总
Jan 06 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
python3库numpy数组属性的查看方法
Apr 17 Python
django用户登录和注销的实现方法
Jul 16 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
python 如何区分return和yield
Sep 22 Python
Django创建一个后台的基本步骤记录
Oct 02 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
在Python 中将类对象序列化为JSON
Apr 06 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中对用户身份认证实现两种方法
2011/06/04 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
php中spl_autoload详解
2014/10/17 PHP
初识laravel5
2015/03/02 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
使用Python读取大文件的方法
2018/02/11 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
Python中property函数用法实例分析
2018/06/04 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
详解python多线程之间的同步(一)
2019/04/03 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
运动会开幕式解说词
2014/02/05 职场文书
入党函调证明材料
2014/12/24 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
小学体育课教学反思
2016/02/16 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
用Python创建简易网站图文教程
2021/06/11 Python