我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

费劲力气在openldap里面添加了新的用户成员,其主要目的就是:使用代码编程到ldap里面验证用户名密码。因为ldap被大家主要用做“统一登陆验证”嘛。所以,用户名密码的验证必然是重头戏。

苏南大叔:ldap_bind()函数,php如何验证ldap成员的用户名密码? - ladp_bind验证用户名密码
ldap_bind()函数,php如何验证ldap成员的用户名密码?(图3-1)

苏南大叔的“平行空间笔记本”博客,记录苏南大叔的编程经验文章。本文测试环境:win10nginx@1.15.11php@8.2.9ntsphp_ldap.soopenldap@2.4.32

写在前面

首先,php里面必须开启ldap的扩展。这个是重要前提!参考下图:

苏南大叔:ldap_bind()函数,php如何验证ldap成员的用户名密码? - ldap_extension
ldap_bind()函数,php如何验证ldap成员的用户名密码?(图3-2)

代码框架

使用php代码链接ldap的前置代码框架,非常简单。

$con = @ldap_connect('ldap://127.0.0.1', 389);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
if ($con) {
  // ldap_bind()
}

接下来的代码,无论是处理什么样的登陆请求,都是对ldap_bind()这个函数的调用。

匿名登陆

主打就是一个危险操作,匿名登陆。虽然phpldapadminconfig/config.php里面,可以配置修改禁止匿名登陆。但是这个主打的也是个“治标不治本”,ldap服务端允许匿名访问的话,谁也没有办法。(这个待后续讨论)

$ldapbind = ldap_bind($con);
if ($ldapbind) {
    echo "匿名登陆成功";
} else {
    echo "匿名登陆失败";
}

根用户及预设用户登陆

在前几篇的文章里面,大家已经知道:默认情况下,openldap有两个用户,还可以通过命令行或者用户工具添加新的用户。

  • 根用户cn=Manager,dc=my-domain,dc=com,密码:sercret
  • 预设用户uid=hacker,ou=People,dc=my-domain,dc=com,密码:OneTwo2012
  • 自定义用户cn=s n,ou=People,dc=my-domain,dc=com,密码:11111
$ok = ldap_bind($con, 'cn=Manager,dc=my-domain,dc=com', 'secret');
$ok = ldap_bind($con, 'uid=hacker,ou=People,dc=my-domain,dc=com', 'OneTwo2012');
$ok = ldap_bind($con, 'cn=s n,ou=People,dc=my-domain,dc=com', '11111');

苏南大叔:ldap_bind()函数,php如何验证ldap成员的用户名密码? - bind代码截图
ldap_bind()函数,php如何验证ldap成员的用户名密码?(图3-3)

简单模糊用户名dn登陆

ldap里面的dn就是大家所熟识的username。然而真实的dn变量里面各种“定语”太长了,导致dn和大家常见的用户名相关较大。所以,大家可以设置basedn来省略掉基础的dn部分数据,然后再利用ldap_bind()进行验证逻辑了。比如:

$username = "s n";
$password = "11111";
$ok = ldap_bind($con, 'cn='.$username.',ou=People,dc=my-domain,dc=com', $password);

不过这种方案里面,对于dn的格式要求比较高。如果说,对于dn的格式并不是特别严格的话,比如预设用户hacker,它的dn就是使用uid进行定义的,而不是这里的cn。这种情况下,就需要使用ldap_search来进行高级的模糊逻辑处理了。这个待后续文章讨论。

完整代码

$con = @ldap_connect('ldap://127.0.0.1', 389);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
if ($con) {
    $bd = ldap_bind($con);
    var_dump($bd);
    
    $bd = @ldap_bind($con, 'cn=Manager,dc=my-domain,dc=com', 'secret');
    var_dump($bd);

    $bd = @ldap_bind($con, 'uid=hacker,ou=People,dc=my-domain,dc=com', 'OneTwo2012');
    var_dump($bd);

    $bd = @ldap_bind($con, 'cn=s n,ou=People,dc=my-domain,dc=com', '11111');
    var_dump($bd);

    $username = "s n";
    $bd = @ldap_bind($con, 'cn='.$username.',ou=People,dc=my-domain,dc=com', "11111");
    var_dump($bd);
}

相关文章

总结

更多ldap相关文章,请点击苏南大叔的经验文章。链接请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    ldap