文档章节

python实现ldap接入

o
 osc_zoa3moe9
发布于 2019/12/07 17:49
字数 573
阅读 65
收藏 0

精选30+云产品,助力企业轻松上云!>>>

需要提前安装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)

 

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Django项目如何接入公司LDAP帐号认证

点击上方“公众号”可以订阅哦! 一、前言 Django项目开发过程中,为了保证安全性,通常都会接入用户帐号认证权限功能,而标题中LDAP是什么呢?当然这个不是本文介绍的重点,简单来说,LDAP是...

狂师
2017/05/21
0
0
企业级项目|用Python进行web开发企业统一用户认证和权限控制平台

目前大家对Python的了解更多来源是数据分析、Ai、运维工具开发,在行业中使用Python进行web开发,同样也是非常受欢迎的,例如:FaceBook,豆瓣,知乎,饿了么等等,本文主要是介绍是利用Pyt...

妄心xyx
2018/12/14
0
0
Python内置的urllib模块不支持https协议的解决办法

Django站点使用django_cas接入SSO(单点登录系统),配置完成后登录,抛出“urlopen error unknown url type: https”异常。寻根朔源发现是python内置的urllib模块不支持https协议。 >>> im...

gcczhongduan
2017/04/09
0
0
教你用Python来做物联网,就是这么牛逼,小白也可以看懂

搭建整套物联网系统的方法有很多,最近四处捣鼓,使用python + 阿里云搭建一套最简单的物联系统,可以将单片机上的数据通过阿里云传输到PC端。 注意:很多人学Python过程中会遇到各种烦恼问题...

osc_o60il3e6
04/16
84
0
loonflow 工单系统

该项目是基于django的工作流引擎,工单。项目托管在 Github 一、安装基础环境 1.1 安装python 和 pip yum install -y epel-releaseyum install -y https://centos7.iuscommunity.org/ius-rel...

osc_uctp74i1
2019/10/14
7
0

没有更多内容

加载失败,请刷新页面

加载更多

Mysql 通过binlog日志恢复数据

Binlog日志,即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日志来恢复数据...

osc_lduvstkg
36分钟前
12
0
前端js日期时间格式转换

前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示。 下面是分享一些不同格式的日期转换函数方法。 /** * 时间戳转时间 * @param...

osc_gccs85s0
38分钟前
9
0
微服务中如何设计一个权限授权服务

基于角色的访问控制 (RBAC)   是将系统访问限制为授权用户的一种方法,是围绕角色和特权定义的与策略无关的访问控制机制,RBAC的组件使执行用户分配变得很简单。   在组织内部,将为各种...

osc_ie20bwji
40分钟前
12
0
前端js日期时间格式转换

前端前后端接口处理时经常会遇到需要转换不同时间格式的情况,比如时间戳格式转换成正常日期显示来进行前端展示。 下面是分享一些不同格式的日期转换函数方法。 /** * 时间戳转时间 * @param...

osc_sqfqhs81
41分钟前
38
0
(转)【D3D11游戏编程】学习笔记三:XNAMath之XMMATRIX

(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在熟悉了XMVECTOR的风格及规则之后,再来了XNA数学库中的矩阵就容易...

osc_yumj26qz
43分钟前
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部