Python 使用LDAP验证

 

安装

pip install ldap3

  在windows平台安装时,如果报错无法安装python-ldap时,需要我们去下载源码包安装,网址如下:https://blog.csdn.net/zwolfer/article/details/102503536

  • 注意: 在whl文件要选择对应的适合当前python版本及系统平台的文件,如:

    python_ldap-3.2.0-cp36-cp36m-win_amd64,表示适用于3.6版本的python 以及 64位操作系统的windows平台
    ​
    下载完成后,将下载完的文件拖入项目文件,运行:
    pip install python-ldap-xxx

 

最终实现代码

下列是一个简单的Demo

from ldap3 import Server, Connection, SUBTREE
​
​
class LDAP:
    """ LDAP验证类 """
​
    def __init__(self, ldap_host, ldap_port, ldap_admin_user, ldap_admin_password, ldap_base_search):
        """
        初始化LDAP配置
        :param ldap_host:  ldap服务器地址
        :param ldap_port: 默认389
        :param ldap_admin_user:  ldap管理员账户用户名
        :param ldap_admin_password: ldap管理员账户密码
        :param ldap_base_search: 用户查询域
        """
        self.ldap_host = ldap_host
        self.ldap_port = ldap_port
        self.ldap_admin_user = ldap_admin_user
        self.ldap_admin_password = ldap_admin_password
        self.ldap_base_search = ldap_base_search
​
    def validation(self, username, password):
        """
        获取用户搜索入口
        :return:
        """
        s = Server(host=self.ldap_host, port=self.ldap_port, use_ssl=False, get_info='ALL')
​
        # 连接ldap服务器
        ldapz_admin_connection = Connection(s, user=self.ldap_admin_user, password=self.ldap_admin_password,
                                            auto_bind='NONE',
                                            version=3,
                                            authentication='SIMPLE', client_strategy='SYNC', auto_referrals=True,
                                            check_names=True,
                                            read_only=False, lazy=False,
                                            raise_exceptions=False)
​
        # 连上以后必须bind才能有值
        ldapz_admin_connection.bind()
​
        # 这个是为了查询你输入的用户名的入口搜索地址,可以选入search_scope进行筛选
        res = ldapz_admin_connection.search(search_base=self.ldap_base_search,
                                            search_filter='(cn={})'.format(username),
                                            search_scope=SUBTREE,
                                            attributes=['cn', 'givenName', 'mail', 'sAMAccountName'],
                                            )
        try:
            if res:
                entry = ldapz_admin_connection.response[0]
                dn = entry['dn']
                attr_dict = entry['attributes']
​
                try:
                    # 这个connect是通过你的用户名和密码还有上面搜到的入口搜索来查询的
                    conn2 = Connection(s, user=dn, password=password, check_names=True, lazy=False,
                                       raise_exceptions=False)
                    conn2.bind()
                    if conn2.result["description"] == "success":
                        return True
                    else:
                        return False
                except Exception as e:
                    return False
​
        except KeyError as e:
            return False
​
​
config = {
    'ldap_host': '10.23.1.2',  # ldap服务器地址
    'ldap_port': 389,  # 默认389
    'ldap_admin_user': 'Sct',  # ldap管理员账户用户名
    'ldap_admin_password': 'Oxsdfa',  # ldap管理员账户密码
    'ldap_base_search': 'dc=xxx,dc=com',  # 查询域
}
​
ldap = LDAP(**config)
​
if __name__ == '__main__':
    print(ldap.validation('w', '$a'))

  

 

猜你喜欢

转载自www.cnblogs.com/double-W/p/12508840.html