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 记录日志的灵活性和可配置性介绍
Feb 27 Python
python 限制函数调用次数的实例讲解
Apr 21 Python
python3 读取Excel表格中的数据
Oct 16 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
通过celery异步处理一个查询任务的完整代码
Nov 19 Python
Python中求对数方法总结
Mar 10 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
python多进程使用函数封装实例
May 02 Python
详解用Python爬虫获取百度企业信用中企业基本信息
Jul 02 Python
手残删除python之后的补救方法
Jun 26 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程序中的常见漏洞进行攻击
2006/10/09 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
TypeScript入门-接口
2017/03/30 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
Python之web模板应用
2017/12/26 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
Python post请求实现代码实例
2020/02/28 Python
用python实现学生管理系统
2020/07/24 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
sort命令的作用和用法
2013/08/25 面试题
机电一体化专业应届本科生求职信
2013/09/27 职场文书
鸿星尔克广告词
2014/03/21 职场文书
我的求职择业计划书
2014/04/04 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
政协工作总结2015
2015/05/20 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP