我用php为公司作了一个图书管理系统,用以管理内部图书和借阅工作。
主要功能有:
1、用户管理:只有被管理员添加到用户表里的用户才能登录系统进行图书借阅
2、库存图书管理:管理员可以对库存图书进行增删改操作。
3、借阅规则管理:管理员可以规定本人最多借阅数量,和每本图书最大节约天数。
4、当用户借阅数量达到最大值或有一本书超过了最大借阅天数,则系统自动屏蔽借书功能。并弹出还书提示框。
以上功能都已实现。并将数据存储至mysql数据库。
但
公司的域管理员兼作图书管理系统的管理员。他提出一个问题:如果公司新来一位员工能否在我为他添加域用户后,这个新用户就可以有权登陆图书管理系统进行图书借阅。
我的思路是:
不对程序作大的改动,加入一个模块,通过ldap搜索主域控制器中的用户信息,并将系统所需信息同步到Mysql的用户表。每天夜间24点系统自动搜索并同步。
不知这个思路是否可行?望高手指教。
其次:在技术上用php通过ldap连AD是否可行。在网上找不到这方面资料。
在命令行下可以列出,用PHP-LDAP却列不出,想不出个所以然来..大家努力啊.
下例为列出当前域内用户名(非PHP_LDAP方式):
<?php
set_time_limit(180);
//设域名为netvt.net
$dnpre = "netvt";
$dnend = "net";
exec("ldifde -f ldif.ldif -v -d \"cn=users,DC=$dnpre,DC=$dnend\" -r \"(objectClass=user)\"") ;
$meme = file("ldif.log");
echo "当前域内用户:<br>";
for ($i = 0; $i < count($meme); $i++) {
if(ereg("CN=.*CN",$meme[$i],$str)) echo substr(substr($str[0],3),0,-3)."<br>";
};
?>
下例为PHP-LDAP方式.试验无结果.
<?php
$ldap[host] = "jw.netvt.net";
$ldap[port] = 389;
$ldap[dn] = "cn=users,DC=netvt,DC=net";
$ldap[base] = "";
// connecting to ldap
echo "start LDAP <br>";
echo "连接中 ...";
$ds=ldap_connect($ldap[host],$ldap[port]);
echo "连上 ".$ds."<br>";
if ($ds) {
echo "绑定中....";
$r = ldap_bind($ds);
if ($r) echo "绑定成功<br>" ;
else echo "绑定失败<br>";
echo "搜寻用户 ...";
$sr=ldap_search($ds,$ldap[dn], "(objectClass=user)"); //此处有返回值
echo "返回 ".$sr."<br>";
echo "该域用户有 ".ldap_count_entries($ds,$sr)." 个<br>";//取得搜寻的结果数目失败????????
echo "取出域用户资料 ...<br>";
$info = ldap_get_entries($ds, $sr);
echo "资料返回 ".$info["count"]." 个:<br>";
for ($i=0; $i<$info["count"]; $i++) {
echo "dn 为: ". $info[$i]["dn"] ."<br>";
echo "cn 为: ". $info[$i]["cn"][0] ."<br>";
}
echo "关闭链接<br>";
ldap_close($ds);
} else {
echo "无法连接到 活动目录\r\n";
}
?>
大家继续.......
严重关注, 查了好多资料都没有找到!
我一直在考虑两个问题:
1.怎样在PHP程序中验证win2k域用户?
2.怎样实现win2k,unix的单一用户认证?
一定会用到LDAP,但我不会:(
楼主这个问题其实就是我的第1个问题,我目前是这样解决的:
开设域用户后通常会同时给用户一个邮箱的吧? 如果没有邮箱, 下面的就不用看了
邮箱是支持ESMTP的吧? 也就是用户必须验证才可发信, 一般现在的邮件服务器都支持ESMTP
好了! 到网上搜一篇php通过socket连接email服务器发信的文章,作者好象是limoduo 记不清了,很抱歉:) 稍微改一下就可以了
思路是这样的,通过socket连接email服务器,在验证用户这一步,判断返回码就可以了,原程序在验证后开始发邮件,后面的不需要,退出即可!
大家可以试试, 不过但愿你不是用的M$ exchange , 会气S你的! 我现在用MDaemon
分析命令行下.
ldifde -f ldif.ldif -v -d "cn=users,DC=$dnpre,DC=$dnend" -r "(objectClass=user)"
生成的ldif.ldif文件.
应该可以得到你想要的全部域用户信息.
谢谢.共同进步! 在PHP版混个星还真不容易:P
你可以把这个文件创建到WEB服务的根目录之外.
比如:
ldifde -f c:\ldif.ldif -v -d "cn=users,DC=$dnpre,DC=$dnend" -r "(objectClass=user)"
用ADO好象不行吧.不过ADSI是肯定可以的!
Php如何与LDAP连接和关闭
$ds=ldap_connect("ServerName")
ServerName是LDAP的服务器名,
例:
$ds=ldap_connect(“10.31.172.30:1000”)
返回值是:true 或 false
关闭连接
ldap_close($ds);
2.2 在php中如何搜索用户信息
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
$justthese = array("cn","userpassword",”location”);
//搜索函数中的一个参数,要求返回哪些信息,
//以上传回cn,userpassword,location,这些都要求小写
$sr=ldap_search($ds,"o=jite", "cn=dom*",$justthese);
//第一个参数开启LDAP的代号
//第二个参数最基本的 dn 条件值 , 例:”o=jite,c=cn”
//第三个参数 filter 为布林条件,它的语法可以在 Netscape 站上找一份 dirsdkpg.pdf 档案.
// ’o’为组织名,’cn’ 为用户名,用户名可用通配符 ’*’
echo "domadmin姓氏有".ldap_count_entries($ds,$sr)." 个<p>";
//ldap_count_entries($ds,$sr)传回记录总数
$info = ldap_get_entries($ds, $sr);
//LDAP的全部传回资料
echo "资料传回 ".$info["count"]."笔:<p>";
for ($i=0; $i<$info["count"]; $i++) {
echo "dn为:". $info[$i]["dn"] ."<br>";
echo "cn为:". $info[$i]["cn"][0] ."<br>"; //显示用户名
echo "email为:". $info[$i]["mail"][0] ."<p>"; //显示mail
echo "email为:". $info[$i][“userpassword"][0] ."<p>"; //显示加密后的密码
}
2.3 添加用户
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
$r=ldap_bind($ds,"cn=domadmin,o=jite","password");
//系住一个管理员,有写的权限
// cn=domadmin,o=jite顺序不能变
$info["cn"]="aaa"; //必填
$info["userpassword"]="aaa";
$info["location"]="shanghai";
$info["objectclass"] = "person"; //必填person为个人,还有server…
ldap_add($ds, "cn=".$info["cn"].",o=jite", $info);
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.4 删除用户
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
ldap_bind($ds,"cn=domadmin,o=jite","password");
//绑定管理员,有删除的权限
$dn="cn=dingxf,o=jite";
ldap_delete($ds, $dn);
//删除用户
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.5 修改用户资料
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
ldap_bind($ds,"cn=domadmin,o=jite","password");
//绑定管理员,有修改的权限
$dn="cn=dingxf,o=jite";
//用户dn
$info["userpassword"]="aaa"; //要修改的信息,放在数组变量中
$info["location"]="shanghaisdaf";
ldap_modify($ds, $dn , $info);
//修改函数
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.6 用户登录验证
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
if (ldap_bind($ds,"cn=dingxf,o=jite","dingxf")){
echo "验证通过";
}else{
echo "验证不通过";
}
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
注:此方法比较简单,实用,它也有不足之处,如果不通过,ldap_bind()提示它自带的提示语:”Warning: LDAP: Unable to bind to server: Inappropriate authentication in /home/htdocs/jldl.net/ldap/test.php3 on line 16”