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中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
python二分查找算法的递归实现方法
May 12 Python
Python随机生成手机号、数字的方法详解
Jul 21 Python
浅谈django开发者模式中的autoreload是如何实现的
Aug 18 Python
详解小白之KMP算法及python实现
Apr 04 Python
Python数据类型之Number数字操作实例详解
May 08 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
Python中xml和dict格式转换的示例代码
Nov 07 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
python wxpython 实现界面跳转功能
Dec 17 Python
Python改变对象的字符串显示的方法
Aug 01 Python
python logging 重复写日志问题解决办法详解
Aug 04 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
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
PHP数组函数知识汇总
2016/05/12 PHP
js常见表单应用技巧
2008/01/09 Javascript
javascript radio 联动效果
2009/03/04 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
Bootstrap表单布局
2016/07/19 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
详解JS预解析原理
2020/06/16 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
python基于phantomjs实现导入图片
2016/05/13 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
wxPython实现列表增删改查功能
2019/11/19 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
贝佳斯官方网站:Borghese
2020/05/08 全球购物
厨师长岗位职责
2014/03/02 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
初中数学教学随笔
2015/08/15 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB