当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: help me 在线等待 ......
    摘要: help me 在线等待 ......


高分PHP通过ldap连windows的Active Directory

我用php为公司作了一个图书管理系统,用以管理内部图书和借阅工作。  
  主要功能有:  
  1、用户管理:只有被管理员添加到用户表里的用户才能登录系统进行图书借阅  
  2、库存图书管理:管理员可以对库存图书进行增删改操作。  
  3、借阅规则管理:管理员可以规定本人最多借阅数量,和每本图书最大节约天数。  
  4、当用户借阅数量达到最大值或有一本书超过了最大借阅天数,则系统自动屏蔽借书功能。并弹出还书提示框。  
  以上功能都已实现。并将数据存储至mysql数据库。  
  但  
  公司的域管理员兼作图书管理系统的管理员。他提出一个问题:如果公司新来一位员工能否在我为他添加域用户后,这个新用户就可以有权登陆图书管理系统进行图书借阅。  
  我的思路是:  
  不对程序作大的改动,加入一个模块,通过ldap搜索主域控制器中的用户信息,并将系统所需信息同步到Mysql的用户表。每天夜间24点系统自动搜索并同步。  
  不知这个思路是否可行?望高手指教。  
  其次:在技术上用php通过ldap连AD是否可行。在网上找不到这方面资料。

NO.1   作者: netvt

在命令行下可以列出,用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";  
  }  
   
  ?>  
   
   
  大家继续.......

NO.2   作者: p4nt1um

严重关注,   查了好多资料都没有找到!    
  我一直在考虑两个问题:  
  1.怎样在PHP程序中验证win2k域用户?  
  2.怎样实现win2k,unix的单一用户认证?  
   
  一定会用到LDAP,但我不会:(  
   
  楼主这个问题其实就是我的第1个问题,我目前是这样解决的:    
  开设域用户后通常会同时给用户一个邮箱的吧?   如果没有邮箱,   下面的就不用看了  
  邮箱是支持ESMTP的吧?   也就是用户必须验证才可发信,   一般现在的邮件服务器都支持ESMTP  
  好了!   到网上搜一篇php通过socket连接email服务器发信的文章,作者好象是limoduo   记不清了,很抱歉:)     稍微改一下就可以了  
  思路是这样的,通过socket连接email服务器,在验证用户这一步,判断返回码就可以了,原程序在验证后开始发邮件,后面的不需要,退出即可!  
   
  大家可以试试,   不过但愿你不是用的M$   exchange   ,   会气S你的!   我现在用MDaemon

NO.3   作者: netvt

分析命令行下.  
  ldifde   -f   ldif.ldif   -v   -d   "cn=users,DC=$dnpre,DC=$dnend"   -r   "(objectClass=user)"  
  生成的ldif.ldif文件.  
  应该可以得到你想要的全部域用户信息.

NO.4   作者: netvt

谢谢.共同进步!   在PHP版混个星还真不容易:P  
   
  你可以把这个文件创建到WEB服务的根目录之外.  
  比如:  
  ldifde   -f   c:\ldif.ldif   -v   -d   "cn=users,DC=$dnpre,DC=$dnend"   -r   "(objectClass=user)"  
   
  用ADO好象不行吧.不过ADSI是肯定可以的!

NO.5   作者: DFlyingchen

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”


    摘要: help me 在线等待 ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE