PHP史上最全的LDAP对接获取用户信息方案

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];
    }
}


好了,如果有帮助点个关注吧。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值