Python使用ldap3认证

一、安装ldap3模块(python版本为python3以上,Django=1.11.8)
pip install ldap3

二、相关代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from ldap3 import Server, Connection, ALL, SUBTREE, ServerPool, ALL_ATTRIBUTES

LDAP_SERVER_POOL = ["172.17.0.10"]
LDAP_SERVER_PORT = 389
ADMIN_DN = "admin@testdomain.com"
ADMIN_PASSWORD = ""
SEARCH_BASE = "ou=Users,dc=testdomain,dc=com"


def ldap_auth(username, password):
    ldap_server_pool = ServerPool(LDAP_SERVER_POOL)
    conn = Connection(ldap_server_pool, user='{}@testdomain.com'.format(username), password=password, check_names=True, lazy=False,
                      raise_exceptions=False)
    conn.open()
    conn.bind()

    res = conn.search(
        search_base=SEARCH_BASE,
        search_filter='(sAMAccountName={})'.format(username),
        search_scope=SUBTREE,
        attributes=['cn', 'givenName', 'mail', 'sAMAccountName', 'memberOf'],
        #ALL_ATTRIBUTES:获取所有属性值
        # attributes=ALL_ATTRIBUTES,
        paged_size=5
    )

    if res:
        entry = conn.response[0]
        dn = entry['dn']
        attr_dict = entry['attributes']

        # check password by dn
        try:
            conn2 = Connection(ldap_server_pool, user=dn, password=password, check_names=True, lazy=False,
                               raise_exceptions=False)
            conn2.bind()
            if conn2.result["description"] == "success":
                if 'CN=upload,OU=Users,DC=testdomain,DC=com' in attr_dict.get('memberOf'):
                    print((True,attr_dict["sAMAccountName"], attr_dict["mail"], attr_dict["cn"],attr_dict["department"], attr_dict["givenName"]))
                    return (True, attr_dict.get('cn'), None)
                else:
                    return (False, attr_dict.get('cn'), '没有权限访问')
            else:
                return (False, None, '用户名或密码错误')
        except Exception as e:
            return (False, None, '用户名或密码错误')
    else:
        return (False, None, '用户名或密码错误')


if __name__ == "__main__":
    ldap_auth("admin", "123456")
#!/usr/bin/python3
# -*- coding: utf-8 -*-

# from ldap3 import Server, Connection, ALL, NTLM
from ldap3 import Server, Connection, ALL, SUBTREE, ServerPool, ALL_ATTRIBUTES
import json

LDAP_SERVER_POOL = ["172.18.188.7"]
LDAP_SERVER_PORT = 389
ADMIN_DN = "admin@southpark.com"
ADMIN_PASSWORD = ""
SEARCH_BASE = "ou=south,dc=southpark,dc=com"


class Operate_AD(object):
    def __init__(self, Domain, User, Password):
        self.domain = Domain
        self.user = User
        self.pwd = Password
        self.DC = ','.join(['DC=' + dc for dc in Domain.split('.')])
        self.pre = Domain.split('.')[0].upper()
        self.ldap_server_pool = ServerPool(LDAP_SERVER_POOL)
        # self.server = Server(self.domain, use_ssl=True,get_info=ALL)
        # self.conn = Connection(self.ldap_server_pool, user=ADMIN_DN, password=ADMIN_PASSWORD, check_names=True,
        #                        lazy=False,
        #                        raise_exceptions=False)
        # self.conn.open()
        # self.conn.bind()
        # self.conn = Connection(self.ldap_server_pool, user='{}@{}'.format(self.user, self.domain), password=self.pwd,
        #                        check_names=True,
        #                        lazy=False,
        #                        raise_exceptions=False)
        # self.conn.open()
        # self.conn.bind()
        try:
            self.conn = Connection(self.ldap_server_pool, user=self.pre + '\\' + self.user, password=self.pwd,
                                   auto_bind=True)
        except Exception as e:
            print(e)

    def Get_UserInfo(self):
        """
        搜索用户信息
        :return:
        """
        resuser = self.conn.search(
            # search_base=self.DC,
            search_base=SEARCH_BASE,
            # search_filter='(sAMAccountName={})'.format(username),
            search_filter='(&(objectCategory=person)(objectClass=user)(sAMAccountName={}))'.format(self.user),
            search_scope=SUBTREE,
            attributes=['cn', 'givenName', 'mail', 'sAMAccountName', 'memberOf'],
            # ALL_ATTRIBUTES:获取所有属性值
            # attributes=ALL_ATTRIBUTES,
            paged_size=5
        )
        if resuser:
            entry = self.conn.response[0]
            dn = entry['dn']
            attr_dict = entry['attributes']
            print(dn)
            return attr_dict

    def Get_ALL_GroupInfo(self):
        """
        搜索所有组信息
        :return:
        """
        resgroup = self.conn.search(
            # search_base=self.DC,
            search_base=SEARCH_BASE,
            search_filter='(objectclass=group)',
            search_scope=SUBTREE,
            attributes=['cn', 'member', 'objectClass', 'userAccountControl', 'sAMAccountName', 'description'],
            # ALL_ATTRIBUTES:获取所有属性值
            # attributes=ALL_ATTRIBUTES,
            paged_size=10
        )

        if resgroup:
            print(self.conn.entries)
            print(self.conn.response)
            for i in self.conn.response:
                print(i['attributes'])
            print(json.loads(self.conn.response_to_json()).get('entries'))
            # entry = self.conn.response[0]
            # attr_dict = entry['attributes']
            # print(attr_dict)

    def userauth(self):
        # check password by dn
        entry = self.conn.response[0]
        dn = entry['dn']
        try:
            conn2 = Connection(self.ldap_server_pool, user=dn, password=self.pwd, check_names=True, lazy=False,
                               raise_exceptions=False)
            if conn2.result["description"] == "success":
                print('认证成功')
                return (True, None)
            else:
                print('用户名或密码错误')
                return (False, None, '用户名或密码错误')
        except Exception as e:
            print(e)
            return (False, None, '用户名或密码错误')


# class Operate_AD():
#     def init(self, Domain, User, Password):
#
#         self.domain = Domain
#         self.user = User
#         self.pwd = Password
#         self.DC = ','.join(['DC=' + dc for dc in Domain.split('.')])
#         self.pre = Domain.split('.')[0].upper()
#         self.server = Server(self.domain, use_ssl=True, get_info=ALL)
#         self.conn = Connection(self.server, user=self.pre + '\\' + self.user, password=self.pwd, auto_bind=True)
#
#     def Get_All_UserInfo(self):
#         '''
#         查询组织下的用户
#         org: 组织,格式为:aaa.bbb 即bbb组织下的aaa组织,不包含域地址
#         '''
#         att_list = ['displayName', 'userPrincipalName', 'userAccountControl', 'sAMAccountName', 'pwdLastSet']
#         # org_base = ','.join(['OU=' + ou for ou in org.split('.')]) + ',' + self.DC
#         res = self.conn.search(search_base=self.DC, search_filter='((objectclass=person))', attributes=att_list,
#                                paged_size=100,
#                                search_scope='SUBTREE')
#         if res:
#             for users in self.conn.entries:
#                 yield users
#         else:
#             print('查询失败: ', self.conn.result['description'])
#         return None
#
#     def Get_All_GroupInfo(self):
#         '''
#         查询组织下的组
#         org: 组织,格式为:aaa.bbb 即bbb组织下的aaa组织,不包含域地址
#         '''
#         att_list = ['cn', 'member', 'objectClass', 'userAccountControl', 'sAMAccountName', 'description']
#         # org_base = ','.join(['OU=' + ou for ou in org.split('.')]) + ',' + self.DC
#         res = self.conn.search(search_base=self.DC, search_filter='(objectclass=group)', attributes=att_list,
#                                paged_size=10,
#                                search_scope='SUBTREE')
#         if res:
#             for group in self.conn.entries:
#                 yield group
#         else:
#             print('查询失败: ', self.conn.result['description'])
#         return None
#
#
# if __name__ == '__main__':
#     act = Operate_AD('demo.com', 'testaccount', 'testpassword')
# for user in act.Get_All_UserInfo():
#     print(user)
# for group in act.Get_All_GroupInfo():
#     print(group)

if __name__ == '__main__':
    res = Operate_AD('southpark.com', 'admin', '123456')
    # res.Get_UserInfo()
    # res.userauth()
    res.Get_ALL_GroupInfo()
ldap查询组信息

官方文档链接:
        https://ldap3.readthedocs.io/en/latest/
        https://docs.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax     #ldap search_filter语法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值