PHP语言对接ldap获取用户信息的例子很少,今天我给大家分享一下,以下经验是我走了很多坑总结出来的。
对接LDAP不是用LDAP的接口,直接用PHP的扩展就可以了。
直接贴代码:
<?php
/**
* 使用ldap的时候需要看一下PHP的扩展是否开启,直接命令行或者phpinfo搜索 LDAP
* 命令行: 1、php -module | grep ldap
* 2、php -r "phpinfo();" | grep LDAP
* ldap 在Yii框架中使用可能中文会乱码成???? (问号)
* 为了防止中文乱码的问题,请将代码放在框架的index.php 的同级目录下,使
* 用的时候请用curl调用
*/
$ldap_password = '123456';
$ldap_username = 'Jokenzhang';
$ip = "192.168.1.198";
set_time_limit(0); // 如果数据量较大,请设置代码执行时间为最大
ini_set("memory_limit", "300M"); // 如果内存不够用可以调整,这里应该是不会出现内存不够的情况,因为我用的是yield生成器
header("Content-Type: text/html; charset=utf-8"); // 这个指定当前文档的编码,可以不用
$ldap_connection = ldap_connect($ip); // 连接ldap
if (FALSE === $ldap_connection) {
return false;
}
// 进行登录用户验证
if (TRUE !== ldap_bind($ldap_connection, $ldap_username, $ldap_password)) {
return false;
}
return get_users($ldap_connection);
/*
* ldap 获取用户数据
*/
function get_users($conn)
{
$dn = 'OU=cc,DC=bb,DC=aa'; // 用户所在的dn目录
$filter = "(&(userprincipalname=*))"; // 条件必填的,固定填写这个就行
$justthese = array("mobile", "cn", "displayname", "userprincipalname","email"); // 获取哪些字段,可以不填
$pageSize = 500; // 每次取出500条
$cookie = '';
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); // 指定ldap的版本 为3 ,最高版本
// 以下do...while 循环默认这么写,官方的写法
$data = [];
do {
ldap_control_paged_result($conn, $pageSize, true, $cookie);
$result = ldap_search($conn, $dn, $filter, $justthese, 0, 0);
$entries = ldap_get_entries($conn, $result);
if (!empty($entries)) {
// 利用yield 循环
$yieldData = createRange($entries["count"], $entries);
foreach ($yieldData as $item) {
array_push($data, [
'username' => $item["cn"][0] ?? ' ', //用户名
'email' => $item["email"][0] ?? ' ', // 邮箱
'mobile' => $item["mobile"][0] ?? ' ', // 手机号
'name' => $item["displayname"][0] ?? ' ' // 真实姓名
]);
}
}
ldap_control_paged_result_response($conn, $result, $cookie);
} while ($cookie !== null && $cookie != '');
ldap_unbind($conn); // Clean up after ourselves.
return $data;
}
/*
* yield 生成器 , 为了减少内存占用
*/
function createRange($number, $data)
{
for ($i = 0; $i < $number; $i++) {
yield $data[$i];
}
}
好了,如果有帮助点个关注吧。