Django项目中添加ldap登陆认证功能的实现

yipeiwu_com7年前Python基础

最近在开发一个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标准库内置函数complex介绍

本函数可以使用参数real + imag*j方式创建一个复数。也可以转换一个字符串的数字为复数;或者转换一个数字为复数。如果第一个参数是字符串,第二个参数不用填写,会解释这个字符串且返回...

Spring Cloud Feign高级应用实例详解

这篇文章主要介绍了Spring Cloud Feign高级应用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.使用feig...

Python和JavaScript间代码转换的4个工具

Python和JavaScript间代码转换的4个工具

选 Python 还是 JavaScript?虽然不少朋友还在争论二者目前谁更强势、谁又拥有着更为光明的发展前景,但毫无疑问,二者的竞争在 Web 前端领域已经拥有明确的答案。立足于浏览...

让Python脚本暂停执行的几种方法(小结)

1.time.sleep(secs) 参考文档原文: Suspend execution for the given number of seconds. The argument m...

python获取一组汉字拼音首字母的方法

本文实例讲述了python获取一组汉字拼音首字母的方法。分享给大家供大家参考。具体实现方法如下: #!/usr/bin/env python # -*- coding: utf-8...