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之入门(二)基本数据类型
May 25 Python
Python实现list反转实例汇总
Nov 11 Python
python 将json数据提取转化为txt的方法
Oct 26 Python
python实时获取外部程序输出结果的方法
Jan 12 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
对django views中 request, response的常用操作详解
Jul 17 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
Python批量启动多线程代码实例
Feb 18 Python
Python中求对数方法总结
Mar 10 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
解决Python安装cryptography报错问题
Sep 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
PHPShop存在多个安全漏洞
2006/10/09 PHP
PHP读写文件的方法(生成HTML)
2006/11/27 PHP
php socket方式提交的post详解
2008/07/19 PHP
php 使用post,get的一种简洁方式
2010/04/25 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
python实现哈希表
2014/02/07 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
Python执行时间的计算方法小结
2017/03/17 Python
对pandas中to_dict的用法详解
2018/06/05 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
大学生最新职业生涯规划书范文
2014/01/12 职场文书
班主任个人工作反思
2014/04/28 职场文书
会计试用期自我评价
2014/09/19 职场文书
民间个人借款协议书
2014/09/30 职场文书
财务整改报告范文
2014/11/05 职场文书
答谢酒会主持词
2015/07/02 职场文书
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS