PHP操作AD域
在设计公司内部的员工服务平台时,需要实现员工通过自己的域账号登录该平台的功能。这就需要改变原先的php+mysql的登录验证模式,需要思考以下几点:
- 如何进行账号密码验证?是跟原来的操作一样——从服务器上取出用户名密码与前端返回的值相比较?
- 如何实现我们需要的操作?
域服务器为了保证安全性是不会向我们提供用户的密码的,所以我们无法直接取到密码来用作比较。在这里,一个可行的方法是将账号密码验证的任务交由域服务器处理,我们只需要等待返回值的成功与否就可以。(这让我想到了某些平台的“使用第三方登录”的功能,最终的验证还是要交由“第三方”来实现)。
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域中的属性值如下:
width="738" height="523" class="preview-iframe" scrolling="no" src="http://download.csdn.net/source/preview/3973174/e9b61747a097c7d7da0fc9262e15feb7">版权声明:本文为u012515877原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。