Python 连接AD域账户,实现用户名密码验证

2024-08-30 16:04:16 浏览数 (2)

说明:目前在做Python的Django项目,需要与公司的域做连接,进行账号的统一管理,故此有以下代码,给有需要的同仁,

可以用做用户验证

导入库

如没有ldap3库,则需要通过pip进行安装

代码语言:python代码运行次数:0复制
from ldap3 import Server, Connection, ALL, NTLM, SUBTREE
import random
import re

请替换server_address的值,如“ldap://192.168.1.2”,

替换domain的值如“ test.com”

还需要替换以下dc=test,替换为自己的,

代码语言:python代码运行次数:0复制
conn.search(search_base='dc=test,dc=com',
                    search_filter=f'(sAMAccountName={username})',
                    search_scope=SUBTREE,
                    attributes=['cn', 'mail'])

替换完成后,下面是全部代码

代码语言:python代码运行次数:1复制
#提取AD域用户信息,如果不需要可以做删除,这个在下方代码中有调用,
def get_info(adinfo):
    # 使用正则表达式提取
    result = re.search(r'OU=(.*?),', adinfo).group(1)
    return result

#验证用户名密码,
def authenticate_ad(username, password):

    server_address = "ldap://192.168.1.2"
    domain = "test.com"
    server = Server(server_address, get_info=ALL)

    user = f'{domain}\{username}'

    conn = Connection(server, user=user, password=password, authentication=NTLM)
    if conn.bind():
        conn.search(search_base='dc=test,dc=com',
                    search_filter=f'(sAMAccountName={username})',
                    search_scope=SUBTREE,
                    attributes=['cn', 'mail'])

        if len(conn.entries) > 0:
            user_info = conn.entries[0]
            user_dn = user_info.entry_dn
            user_cn = user_info.cn.value
            user_mail = user_info.mail.value if user_info.mail else 'N/A'
            conn.unbind()
            return {'username': user_cn, 'email': user_mail,'dp':get_info(user_dn)}
        else:
            conn.unbind()
            return None
    else:
        return None
        
if __name__ == "__main__":
    username = input("用户名: ")
    password = input("密码: ")
    user_info = authenticate_ad(username, password)
    if user_info:
        print("验证成功,用户名密码正确")
        print(user_info)
        print(f"用户名: {user_info['username']}")
        print(f"邮件地址: {user_info['email']}")
    else:
        print("验证失败")

0 人点赞