第4课:使用Ldap

说起操作,无非是增删改查

Ldap写操作支持的并不好,读的效率很高

常用ldap命令行:
1.搜索
# ldapsearch -x -b 'dc=rfmail' '(objectclass=*)' 'dn'
2.修改
# ldapsearch -x -LLL -b 'dc=rfmail' '(objectclass=*)' 'dn' 'o' > example.ldif
3.删除
# ldapdelete -x -D 'cn=root,dc=rfmail' -w 'godeye.org' -r 'dc=rfmail'
4.导入数据
# ldapadd -x -h 127.0.0.1 -D 'cn=root,dc=rfmail' -W -f mail.ldif

这里以PHP操作Ldap为例来说明如何操作
一般的LDAP编程步骤如下:
ldap_connect() // 连接到LDAP服务器
ldap_bind() // 匿名登陆或者认证登陆
做一些操作,比如读取、添加、删除等...
ldap_unbind() // 关闭连接

如果调试错误,用ldap_error打印出错信息
string ldap_error ( resource $link_identifier )   检索LDAP操作的错误信息

1.连接Ldap
$conn = @ldap_connect('ldap://' . $this->serv['host'] . ":". $this->serv['post'] . '/');
//当然了,这里也有另外一种方式:ldap_connect($ldap_host, $ldap_port) or die("Can't connect to LDAP server")
@ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($conn, $rdn, $pass);//其中$this->serv['rdn']是用户名 $this->serv['pass']是密码,如果没有就不要传了

2.获取某个节点数据,类似于mysql:select * from godeye where id = ?
$godeye = '(objectClass=*)'; //设置过滤  objectClass=*表示没有过滤条件,全部取出来,如果说要取name字段等于godeye的数据,就要用$godeye = '(name=godeye)';
//也支持模糊查询 $godeye = '(name=*godeye*)'
$justthese = array('dn','o'); //设置输出属性,如果要输出所有,就用array('*')相当于mysql中的select * from ...
$search = ldap_search($conn, $rdn, $godeye, $justthese);//$rdn相当于数据库名,类似dc=ai,dc=com这样的格式
$entries = ldap_get_entries($conn, $search);  
print_r($entries);
你会发现结果很凌乱,对照ldap中的数据结构,用代码取你要的数据就可以了

3.修改操作
$new = array('o'=> 'godeye.org');  
$boo = ldap_modify($conn, $rdn, $new);  
if (!$boo) {  
    echo "Modify fail.\n";  
} else {  
    echo "Modify successfully.\n";  
}

4.添加操作
$add_entry = array();  
$add_entry['dc']='godeye.org';  
$add_entry['objectclass']= 'masterdomain';  
$add_entry['kvcount']=0;  
$new_dn='dc=godeye.org,dc=rfmail';  
$boo = ldap_add($conn, $new_dn, $add_entry);  
if (!$boo) {  
    echo "Add fail.\n";  
} else {  
    echo "Add successfully.\n";  
}

5.删除操作
$delete_attr['operateUserList'] = 'freeze';  
$delete_dn='dc=godeye.org,dc=rfmail';  
$boo = ldap_mod_del($l_conn,$delete_dn,$delete_attr);  
if (!$boo) {  
    echo "Delete attributes values fail.\n";  
} else {  
    echo "Delete attributes values sucessfully.\n";  
}  

$boo = ldap_delete($l_conn,$delete_dn);  
if (!$boo) {  
    echo "Delete entry  fail.\n";  
} else {  
    echo "Delete entry  successfully.\n";  
}

中文字符问题
LDAP 中不允许保存GB2312或GB18030字符串,要保存这些字符集,必须用base64或unicode转码。PHP有提供base64_encode()和base64_decode()函数,unicode转码可参考网上资料。
不过,LDAP可接受UTF-8 格式的中文字符。也就是说,您可以把GB2312或GB18030字符串,通过iconv()等函数转为UTF-8 后直接保存到LDAP中。
$utf8 = iconv('GBK', 'UTF-8//TRANSLIT', $string);