说明:目前在做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("验证失败")