linux ldap認證:windos 和 linux 下實現PHP和LDAP身份認證

來源:互聯網
上載者:User

我現在的老闆曾要求我為企業內部互連網的Web服務提供一種標準的驗證方法。我遇到的一個主要問題就是我們公司主要使用了兩種平台:UNIX和Windows。所以,我的第一個想法並不很成功:它要求每個員工都使用UNIX或者Linux而放棄Windows。
我認為解決現在的UNIX/Windows問題的最好方法就是利用PHP的LDAP特性。由於LDAP伺服器,要求我使用現有的系統,主要指的是一個巨大的Microsoft Exchange Server系統。我非常高興使用Exchange,它很可靠,而且LDAP特性的使用和配置也極為簡單。不過,請你注意:這套方案就身分識別驗證角度來看並不是最安全的。如果有較高等級的安全需求,我強烈建議你採用LDAP和SSL。
從哪裡開始學習
為了讓你入門,我給出了一個PHP LDAP函數的清單並對函數的功能給以簡要說明。然後,我將示範如何建立到LDAP伺服器的串連並驗證使用者。為了代碼簡單起見,我將示範PHP串連的功能以及如何綁定到LDAP伺服器。
一對絕配:PHP和LADP
下面是我在例子中將要使用的函數的清單。網上有相關資料。
ldap_connect—用來串連LDAP服務。
ldap_bind—用來綁定到特定的LDAP目錄。
ldap_error—從LDAP伺服器上獲得錯誤資訊。
ldap_search—用來開始搜尋。
ldap_get_entries—從搜尋結果中獲得多個結果。
ldap_close—關閉LDAP串連。
現在我在例子中示範如何使用第一個函數(代碼清單A)並適當介紹該函數的功能。
<?php
// LDAP variables
$ldap[‘user’] = ‘uname’;
$ldap[‘pass’] = ‘password’;
$ldap[‘host’] = ‘ldap.example.com’;
$ldap[‘port’] = 389;
$ldap[‘dn’] = ‘cn’.$ldap[‘user’].’,ou=Department,o=Company Name’;
$ldap[‘base’] = ‘’;
// connecting to ldap
$ldap[‘conn’] = ldap_connect( $ldap[‘host’], $ldap[‘port’] )
or die( “Could not connect to {$ldap[‘host’]}” );
?>
將會返回一個到LDAP伺服器的串連(也稱為資源,即resource)。ldap_connect函數有兩個參數:主機(host)和連接埠。第一個參數:主機就是LDAP主機名稱,第二個參數是LDAP啟動並執行連接埠。預設情況下,LDAP使用的連接埠號碼為389。如果你需要到LDAP伺服器的一個安全連線,你可以把參數host改為一個你可以訪問的LDAP伺服器的URL,如下所示:
$ldap[‘conn’] = ldap_connect( “ldaps://ldap.example.com” );
由於你指定了URL而不是伺服器名稱,在這種方法下,你就不需要使用連接埠參數了。需要牢記的一點就是確切名稱需要與加密通訊端協議層認證(the SSL certificate)對應。
<?php
// LDAP variables
$ldap[‘user’] = ‘uname’;
$ldap[‘pass’] = ‘password’;
$ldap[‘host’] = ‘ldap.example.com’;
$ldap[‘port’] = 389;
$ldap[‘dn’] = ‘cn’.$ldap[‘user’].’,ou=Department,o=Company Name’;
$ldap[‘base’] = ‘’;
// connecting to ldap
$ldap[‘conn’] = ldap_connect( $ldap[‘host’], $ldap[‘port’] )
or die( “Could not connect to {$ldap[‘host’]}” );
// binding to ldap
$ldap[‘bind’] = ldap_bind( $ldap[‘conn’], $ldap[‘dn’], $ldap[‘pass’] );
?>
示範了如何用使用者名稱和口令來綁定到伺服器。我建立了一個合適的網域名稱(domain name ,DN)並用使用者的口令來合法串連到LDAP。我們通過使用網域名稱和口令就可以讓LDAP伺服器通過身份認證並允許綁定串連,這樣我們就成功的綁定上了。ldap_bind的傳回值是一個布爾類型。我們可以根據傳回值判斷使用者的登入認證是否有效。當這個過程結束後,你就可以知道使用者身份是否得到了認證。
如果發生了錯誤會怎樣?調用ldap_error函數是判斷髮生了什麼錯誤的好方法。ldap_error函數返回了一個字串,其中包含了LDAP伺服器發生的最後錯誤的資訊。

<?php
// LDAP variables
$ldap[‘user’] = ‘uname’;
$ldap[‘pass’] = ‘password’;
$ldap[‘host’] = ‘ldap.example.com’;
$ldap[‘port’] = 389;
$ldap[‘dn’] = ‘cn’.$ldap[‘user’].’,ou=Department,o=Company Name’;
$ldap[‘base’] = ‘’;
// connecting to ldap
$ldap[‘conn’] = ldap_connect( $ldap[‘host’], $ldap[‘port’] )
or die( “Could not connect to server {$ldap[‘host’]} );
// binding to ldap
$ldap[‘bind’] = ldap_bind( $ldap[‘conn’], $ldap[‘dn’], $ldap[‘pass’] );
if( !$ldap[‘bind’] )
{
echo ldap_error( $ldap[‘conn’] );
exit;
}
?>
中,我向指令碼中添加了ldap_error函數,如果綁定到LDAP伺服器的使用者身份沒有得到確認,那麼代碼將退出運行。該函數返回一個字串,該字串包含了發送到LDAP伺服器的最後一條指令產生的錯誤資訊。如果你按給定使用者名稱和口令的綁定沒有成功登入,那麼錯誤資訊將包含這對無效的使用者名稱和口令。
在我們的最後一個例子中
<?php
// LDAP variables
$ldap[‘user’] = ‘uname’;
$ldap[‘pass’] = ‘password’;
$ldap[‘host’] = ‘ldap.example.com’; 本文連結http://www.cxybl.com/html/wlbc/Php/20121126/34395.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.