python实现ldap接入
需要提前安装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
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)
遍历某个OU下的所有用户数据
AUTH_LDAP_SERVER_URI = "ldap://ip:port" # 服务器地址
AUTH_LDAP_BIND_DN = 'cn=Manager,dc=xxx,dc=com'
AUTH_LDAP_BIND_PASSWORD = 'password'
AUTH_LDAP_BASE_DN_LIST = ['ou1', 'ou2'] def authenticate():
ldapconn = ldap.initialize(AUTH_LDAP_SERVER_URI)
ldapconn.protocol_version = ldap.VERSION3
ldapconn.bind_s(AUTH_LDAP_BIND_DN, AUTH_LDAP_BIND_PASSWORD) searchScope = ldap.SCOPE_SUBTREE
retrieveAttributes = None
searchFilter = "(&(objectClass=person))" # 这个参数的值是固定的person
for AUTH_LDAP_BASE_DN in AUTH_LDAP_BASE_DN_LIST:
ldap_result_id =ldapconn.search_s("ou={},ou=xx,dc=xxx,dc=com".format(AUTH_LDAP_BASE_DN), searchScope, searchFilter, retrieveAttributes)
for res in ldap_result_id:
print(res)
python实现ldap接入的更多相关文章
- 如何使用Python连接ldap
如何使用Python连接ldap 好多使用ldap认证的软件都是Python的,比如superset和airflow, 好吧,他们都是airbnb家的.在配置ldap的时候可能会出现认证失败,你不知道 ...
- Python实现LDAP用户名密码验证
网上借鉴了不少东西,下面是python代码,备份后用. 思路,因为每个用户的组都不一样,这样就导致了dn不一致的情况, 据需要先根据用户名获取该用户的dn,然后再bind用户名和密码进行验证. 反正是 ...
- Python使用LDAP做用户认证
LDAP(Light Directory Access Portocol)是轻量目录访问协议,基于X.500标准,支持TCP/IP. LDAP目录以树状的层次结构来存储数据.每个目录记录都有标识名(D ...
- Python使用微信接入图灵机器人
1.wxpy库介绍 wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展. 文档地址:https://wxpy.readthedocs.io 从 PYPI 官 ...
- python 调用ldap同步密码
windows + python2.7 安装 python-ldap https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap 2.python ...
- Python通过LDAP验证、查找用户(class,logging)
定义一个类,用于初始化ldap连接,验证.查找用户等功能 # -*- coding: UTF-8 -*- import sys reload(sys) sys.setdefaultencoding(' ...
- python Django框架接入微信公众平台
1.在接入微信公众平台之前,需要在微信公众平台配置好基本信息,如下: 这个时候点击“提交”按钮,会提示“Token校验失败”,不要着急,这是必然会出现的现象,先不要退出页面,保留各项输入的数据,按第二 ...
- ubuntu上安装python的ldap模块
首先安装 apt-get install libldap2-dev 然后再安装 apt-get install libsasl2-dev 然后就可以继续安装你的python-ldap模块了 pip i ...
- 使用python的Flask实现一个RESTful API服务器端[翻译]
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...
随机推荐
- PHP 日历函数手册
PHP日历函数安装>>> 函数名称 描述 cal_days_in_month 返回某个历法中某年中某月的天数 cal_from_jd 转换Julian Day计数到一个支持的历法. ...
- Python 报错 MySQLdb._exceptions.OperationalError: (2059, )
Python连接MySQL数据时:报错提示MySQLdb._exceptions.OperationalError: (2059, <NULL>). Python包: mysqlclien ...
- JS高阶---执行上下文栈
大纲: 主体: 注意:*******函数调用时才会产生上下文栈,声明时不会产生********** 顺序: 概念图: 执行上下文栈的顺序---→后进先出 其他概念图: 当前执行的上下文总是在顶部 全局 ...
- Go语言goroutine调度器初始化(12)
本文是<Go语言调度器源代码情景分析>系列的第12篇,也是第二章的第2小节. 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调 ...
- 万字长文把 VSCode 打造成 C++ 开发利器
https://zhuanlan.zhihu.com/p/96819625 面对大量代码,在开发任务繁重场景下,VSCode 绝对是一把利器.本文虽以 C++为引,但在 python.php.java ...
- VIJOS-P1292 火车票
JDOJ 1404: VIJOS-P1292 火车票 https://neooj.com/oldoj/problem.php?id=1404 Description 一个铁路线上有n(2< =n ...
- USACO Agri-Net
洛谷 P1546 最短网络 Agri-Net https://www.luogu.org/problemnew/show/P1546 JDOJ 1696: Agri-Net https://neooj ...
- javaweb监听器实现与原理
参考:https://www.cnblogs.com/lxp503238/p/6678688.html https://blog.csdn.net/CPOHUI/article/details/888 ...
- 4.Vue双向绑定
1.什么是双向数据绑定 Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化.这也算是 Vue.js 的精髓之处了 ...
- 初赛Part2
初赛 时间复杂度 主定理(必考) \[ T(n) = aT(\frac{n}{b})+f(n) \] 其中,\(n\)为问题的规模,\(a\)为递推下子问题的数量,\(\frac{n}{b}\)为每个 ...