2017-09-29 192 views
0

有沒有一種方法可以通過LDAP驗證用戶,但不使用php的LDAP模塊?不幸的是大多數共享主機似乎沒有ldap模塊。我目前已經在我的本地主機上使用了ldap模塊,但是想用cURL或file_get_contents等替代方法實現同樣的功能。任何幫助都會很棒。謝謝用curl驗證PHP和LDAP

$ldap_connect = ldap_connect("server.ip", 389); 
ldap_set_option($ldap_connect, LDAP_OPT_NETWORK_TIMEOUT, 4); 

     $ldap_fqdn_user=$samaccountname. "@" . $ldap_domain; 

     if (!($bind = ldap_bind($ldap_connect, $ldap_fqdn_user, $ldap_password))) { 
      ldap_close($ldap_connect); 
      echo "Incorrect Username or Password"; 
     } else { 
      ldap_close($ldap_connect); 
      echo "Correct username and password"; 
     } 
+0

一般來說LDAP(第10行)

和感謝http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/是認證的內部/現場方法,共用主機將沒有理由以允許此。你可以做的最好的事情是在你的本地服務器上有一個API,它在內部爲LDAP服務器提供認證請求。儘管這本身就是一種安全風險。 – MackieeE

+0

ofc您可以使用socket_ api手動重新實現LDAP協議,但它會很多工作 – hanshenrik

+0

您*可* *實現純粹使用PHP的LDAP服務器協議,但您不想這樣做。因此,理智的決定不是支持沒有PHP的LDAP模塊的設置。沒有必要爲了支持每一個糟糕的設置而高枕無憂。 – Mjh

回答

0

幸運的是curl對LDAP有原生支持。我從來沒有使用它自己,但我猜相當於curl_setopt將

curl_setopt_array ($ch, array (
     CURLOPT_PROTOCOLS => CURLPROTO_LDAP, 
     CURLOPT_PORT => 389, 
     CURLOPT_URL => 'server.ip', 
     CURLOPT_TIMEOUT => 4, 
     CURLOPT_USERPWD => $ldap_fqdn_user . ':' . $ldap_password 
)); 

這裏是工作的完整示例,檢查如果密碼正確/錯誤,捲曲,

<?php 
declare(strict_types = 1); 
header ("content-type: text/plain;charset=utf8"); 
$ch = curl_init(); 
curl_setopt_array ($ch, array (
     CURLOPT_PROTOCOLS => CURLPROTO_LDAP, 
     CURLOPT_PORT => 389, 
     CURLOPT_URL => 'ldap.forumsys.com', 
     CURLOPT_TIMEOUT => 4, 
     CURLOPT_USERPWD => 'cn=read-only-admin,dc=example,dc=com:password' 
)); 
if (curl_exec ($ch)) { 
    echo "correct password"; 
} else { 
    echo "maybe wrong password? curl got an error. errno:" . curl_errno ($ch) . '. error: ' . curl_error ($ch); 
} 
curl_close ($ch); 

改變密碼例如,paswordd,它會失敗。用於提供公共測試服務器

+0

您發佈的代碼是不可讀的,甚至不涉及LDAP(SSl,TLS,GSS-API,GSS-API + SASL)的不同身份驗證機制的主題。您發佈的代碼只能在與LDAP服務器位於同一網絡的情況下才能使用,他們正確地介紹了公開端口389/636的情況。發佈一些未經測試的代碼的某些內容有什麼意義,這些代碼可以完成某些您不完全瞭解的內容? – Mjh

+0

@Mjh在他的示例代碼中,他使用的端口是389,它是LDAP的未加密版本,所以是的,他想要移植的代碼是使用未加密的LDAP。如果你想使用LDAPS,通常它的端口是636,你必須使用CURLPROTO_LDAPS。我當時也沒有訪問我的IDE,我使用格式化,因此格式化問題..但我現在做。 「發佈大量未經測試的代碼,做了一些你不完全瞭解的事情,有什麼意義?」好吧,因爲從理論上講,這些文檔應該可以工作。 – hanshenrik

+0

我試圖提出的一點是,您提供的只是在特定場景下工作的代碼塊 - 該場景是通過cURL **執行請求的計算機必須位於相同的域/網絡中作爲LDAP服務器。我試圖提出的另一點是,你提供了一個答案,當人們將它谷歌的時候,人們會認爲它是絕對真理,但是你沒有完全測試。你可以擴大它,增加警告,但不是,但你沒有。這將我們帶到了我所問 - 有什麼意義?關鍵是收集虛構的聲譽。對? – Mjh