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 相关文章推荐
利用Django框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
Python 编码Basic Auth使用方法简单实例
May 25 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
超简单的Python HTTP服务
Jul 22 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
python实现监控阿里云账户余额功能
Dec 16 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 Python
python周期任务调度工具Schedule使用详解
Nov 23 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
php 无限分类的树类代码
2009/12/03 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
php实现头像上传预览功能
2017/04/27 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
JavaScript库 开发规则
2009/01/31 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
js document.write()使用介绍
2014/02/21 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
应聘教师自荐信
2013/10/12 职场文书
小学教师节活动方案
2014/01/31 职场文书
房屋公证委托书
2014/04/03 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
小学生教师节广播稿
2015/08/19 职场文书
vue实现登陆页面开发实践
2022/05/30 Vue.js