python实现ldap接入

枫铃4年前 (2021-07-10)Python269

需要提前安装python-ldap模块

python接入ldap其实分了几个步骤:

1、使用一个管理员账户登陆到ldap

2、使用一个字段值是唯一的字段,去搜索到要验证用户的DN值(ldap搜索到的单个用户信息是一个元祖数据,DN值就是元祖数据的第一位数据,"cn=x,ou=xx,ou=xxx,ou=xxxx,dc=xxxxx,dc=com"这个就是DN值)

3、然后使用搜索到的用户的DN值和用户的密码再去登陆一把ldap

Backend.py

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import ldap

class LDAPBackend:
    def authenticate(self, username=None, password=None, **kwargs):
        AUTH_LDAP_SERVER_URI = "ldap://0.0.0.0:389"
        AUTH_LDAP_BIND_DN = 'cn=管理员账号,dc=域名,dc=com'
        AUTH_LDAP_BIND_PASSWORD = '管理员密码' 
        AUTH_LDAP_BASE_DN = 'dc=域名,dc=com'
        if username and password:
            # 初始化ldap连接
            ldapconn = ldap.initialize(AUTH_LDAP_SERVER_URI)
            # 设置连接协议为version3
            ldapconn.protocol_version = ldap.VERSION3
            # 使用管理员账号,密码登陆ldap
            ldapconn.simple_bind_s(AUTH_LDAP_BIND_DN, AUTH_LDAP_BIND_PASSWORD)
            # 根据我们需要的字段(此处的字段是值ldap查询到的数据的字段)搜索到指定的账户,sn是我用的,不同公司的可能不一样,需要根据自己的实际情况确定
            ldap_result_id = ldapconn.search(AUTH_LDAP_BASE_DN, ldap.SCOPE_SUBTREE, "(sn={})".format(username), None)
            # 获取到查询的结果数据
            result_type, result_data = ldapconn.result(ldap_result_id,1)
            # 如果查询到了用户就继续验证
            if(not len(result_data) == 0):
                try:
                    # 初始化ldap连接
                    ldapconn = ldap.initialize(AUTH_LDAP_SERVER_URI)
                    # 使用刚刚查到的登陆用的DN信息和密码再次登陆一下ldap
                    # 1、如果登陆成功会返回一个类似于右边的一个元祖数据(97, [], 1, [])
                    # 2、如果登陆失败就会抛出一个ldap.INVALID_CREDENTIALS的异常
                    ldapconn.simple_bind_s(result_data[0][0], password)
                    logger.debug("ldap auth success")
                    return self._get_or_create_user(result_data[0])
                except ldap.INVALID_CREDENTIALS:
                    return None
            return None
        else:
            return None
 
    def _get_or_create_user(self, user_info=()):
        # 此处去应用的数据库查询用户的权限等信息,如果数据库没有这个用户,需要将用户信息持久化到数据库中去
        #
        #
        #
        #
        return user

引用

user = LDAPBackend().authenticate(username=username, password=password)

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。