LDAP AD網域驗證...
我採用普通的模式都可以,包括查詢使用者..
但是今天寫一個類,報 ldap_search() [function.ldap-search]: Search: Operatio_n_s error
類的代碼如下
$ldapDN,這個是正確的...
ldapBind() 也是可以驗證使用者名稱跟密碼...
但是查詢此使用者的詳細資料會報錯, 網上都提示是因為AD域不支援匿名,但是我加上驗證在search...也還報錯...
不用類的時候,ldap_bind()後, 是可以的...看後面一段代碼
class userldap { private $ldapHost; //AD伺服器位址 private $ldapPort; //AD伺服器連接埠 private $ldapDomin; //AD網域 private $ldapDN = "OU=Users,OU=xxx,OU=abc,DC=adv,DC=ccc,DC=com"; //使用者列表位置 private $userName; private $passWord; public function __construct($ldapDomin, $ldapHost, $ldapPort, $userName, $passWord) { $this->ldapDomin = $ldapDomin; $this->ldapHost = $ldapHost; $this->ldapPort = $ldapPort; $this->userName = $userName; $this->passWord = $passWord; } private function ldapConnect() { if (!$this->ldapConn = ldap_connect($this->ldapHost, $this->ldapPort)) { $this->showerror = ldap_error($this->ldapConn); } else { $this->ldapConn = ldap_connect($this->ldapHost, $this->ldapPort); } return $this->ldapConn; } public function ldapBind() { if (@ldap_bind($this->ldapConnect(), $this->ldapDomin . '\\' . $this->userName, $this->passWord)) { ldap_bind($this->ldapConnect(), $this->ldapDomin . '\\' . $this->userName, $this->passWord); return TRUE; } else { return FALSE; } } public function getUserinfo() { if ($this->ldapBind()) { ldap_bind($this->ldapConnect(), $this->ldapDomin . '\\' . $this->userName, $this->passWord); $this->adResult = ldap_search($this->ldapConnect(), $this->ldapDN, "(sAMAccountName=$this->userName)"); $this->userInfo = ldap_get_entries($this->ldapConnect(), $this->adResult); //獲得查詢結果 } else { $this->userInfo = "NA"; } return $this->userInfo; }}
if (!$ldap_conn = ldap_connect($ldap_host, $ldap_port)) { $tip = "LADP HOST" . $ldap_host . " CANNOT CONNECT"; } else { if (@ldap_bind($ldap_conn, $doMain . '\\' . $userName, $passWord)) { $query = $db->select("bp_user", "userFullname", "where userNT='$userName'"); if ($row = $db->fetch_array($query)) { $_SESSION['userName'] = $row['0']; $_SESSION['passWord'] = $passwordDb; $db->update("bp_user", "userPassword = '$passwordDb', userLogin=userLogin+1, userLoginip=INET_ATON('$lastip'),userUpdate='$nowtime'", "where userNT='$userName'"); ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server."); $msg = "USERNAME " . $row[0] . " Login In OK"; unset($query); unset($row); Get_admin_msg($lastUrl, $msg, 'main'); } else { $base_dn = "OU=Users,OU=xxx,OU=abc,DC=adv,DC=ccc,DC=com";; $filter_col = "sAMAccountName"; //定義用於查詢的列 $filter_val = $userName; //定義用於匹配的值 $result = ldap_search($ldap_conn, $base_dn, "($filter_col=$filter_val)"); //執行查詢 $entry = ldap_get_entries($ldap_conn, $result); //獲得查詢結果 $userFullname = strtoupper($entry[0]['cn'][0]); $userEmail = $entry[0]['mail'][0]; $userDept = $entry[0]['department'][0]; $userCustomer = $entry[0]['roomnumber'][0]; $entry = NULL; $result = NULL; ldap_unbind($ldap_conn) or die("Can't unbind from LDAP server."); $query = NULL; $row = NULL;}
回複討論(解決方案)
那你就看看用類之後,參數是不是正確傳遞了,就是參數對不對
參數都是一樣的....
所以很奇怪...
問題解決掉咯...
還是那個認證的問題...
我不知道是不是可以說成是線程的問題...
調用ldap_search之前必須要滿足連結到ldap server並且通過ldap_bind的認證...
而在function裡面,ldap_bind後,再進行Ldap_search的時候,再一次連結ldap server,產生的resource ID不一樣...並且這個resouce ID沒有進行ldap_bind認證...
所以修改的辦法就是
調用getUserinfo的這個function的時候,需要再次重新連結ldap伺服器並通過認證再擷取使用者資訊,這樣就不會報錯...