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发腾讯微博代码分享
Jan 10 Python
Python获取当前时间的方法
Jan 14 Python
python实现逆波兰计算表达式实例详解
May 06 Python
python实现抖音视频批量下载
Jun 20 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
python解析yaml文件过程详解
Aug 30 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
django的模型类管理器——数据库操作的封装详解
Apr 01 Python
python把一个字符串切开的实例方法
Sep 27 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
Python趣味挑战之教你用pygame画进度条
May 31 Python
实例讲解Python中sys.argv[]的用法
Jun 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
PHP数据库开发知多少
2006/10/09 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
PDO::query讲解
2019/01/29 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
2015/12/13 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
基于JavaScript实现轮播图效果
2021/01/02 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
python 文件操作api(文件操作函数)
2016/08/28 Python
python实现梯度下降算法
2020/03/24 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
python文件写入write()的操作
2019/05/14 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
英语专业学生的自我评价
2013/12/30 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
2014年教务处工作总结
2014/12/03 职场文书
个人催款函范文
2015/06/23 职场文书
再谈python_tkinter弹出对话框创建
2022/03/20 Python
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫