PHP操作AD域入门(二)

PHP操作AD域

在设计公司内部的员工服务平台时,需要实现员工通过自己的域账号登录该平台的功能。这就需要改变原先的php+mysql的登录验证模式,需要思考以下几点:

  1. 如何进行账号密码验证?是跟原来的操作一样——从服务器上取出用户名密码与前端返回的值相比较?
  2. 如何实现我们需要的操作?

域服务器为了保证安全性是不会向我们提供用户的密码的,所以我们无法直接取到密码来用作比较。在这里,一个可行的方法是将账号密码验证的任务交由域服务器处理,我们只需要等待返回值的成功与否就可以。(这让我想到了某些平台的“使用第三方登录”的功能,最终的验证还是要交由“第三方”来实现)。
AD域是建立在ldap协议之上的。与操作mysql相似,PHP为我们提供了操作ldap的函数库。那么我们就可以据此来实现对AD的访问操作。

    $host = "ldap://10.0.0.2";
    $port = 389;

    //连接到LDAP服务器
    if(!@$connection = ldap_connect($host, $port))
    {
        echo 1;     //失败则返回错误代码1,并退出。
        exit();
    }

    //声明使用版本3
    ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3);
    //使用start TLS安全通信机制
    ldap_start_tls($connection);

    //绑定,相当于用户登录
    if(!@ldap_bind($connection, "SYNTHFLEX\\".$username, $password))
    {
        echo -1;    //失败则返回错误代码-1,并退出。
        exit();
    }
    echo 0;   //成功,返回0

接下来可以对域服务器上的信息进行查找

    //获取LDAP数据
    $dn = "cn=USERS, dc=synthflex, dc=com";      //dn路径
    $filter = "(samaccountname=$username)";      //筛选器
    $attributes = array('sn','givenname');       //所要获取的项的名称
    $result_ldap = ldap_search($connection, $dn, $filter, $attributes);

以上的代码功能是获取dn=“cn=USERS, dc=synthflex, dc=com”,登录名(samaccountname)为$username的记录中“姓(sn)”和“名(givenname)”两项的值。

Tips:ldap_search的参数规范

  • $dn的类型是字符串,与php中的mysql_query不同,该字符串中的“=”后的值不需要用单引号括起来。如$dn = "cn='USERS', dc='synthflex', dc='com'"; 是错误的。
  • $filter则必须要用“()”将筛选器的代码括起来,这是windows下的AD的特殊规范。
  • $attributes参数类型是数组,切记。

更多有关AD域中的属性值如下:

你可能感兴趣的:(PHP,LDAP,ad)