在Windows和UNIX下利用PHP和LDAP進行身分識別驗證

來源:互聯網
上載者:User

標籤:http   os   使用   io   strong   for   ar   資料   art   

我現在的老闆曾要求我為企業內部的Web服務提供一種標準的驗證方法。我遇到的一個主要問題就是我們公司主要使用了兩種平台:UNIX和。所以,我的第一個想法並不很成功:它要求每個員工都使用UNIX或者Linux而放棄。

我認為解決現在的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’;
$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;
}

// search for the user on the ldap server and return all
// the user information
$ldap[‘result’] = ldap_search( $ldap[‘conn’], $ldap[‘base’], ‘uid=’.$ldap[‘user’] );

if( $ldap[‘result’] )
{
// retrieve all the entries from the search result
$ldap[‘info’] = ldap_get_entries( $ldap[‘conn’], $ldap[‘result’] );
}
else
{
echo ldap_error( $ldap[‘conn’] );
exit;

}

if( $ldap[‘info’] )
{
// Add the user’s department name and email address
// to the session
$_SESSION[‘userdept’] = $ldap[‘info’][0][‘department’][0];
$_SESSION[‘usermail’] = $ldap[‘info’][0][‘mail’][0];
}
else
{
echo ldap_error( $ldap[‘conn’] );
exit;
}

// close connection to ldap server
$ldap_close( $ldap[‘conn’] );

?>

我同時使用了上述函數清單中的最後列出的三個函數:: ldap_search、ldap_get_entries以及ldap_close.

當代碼清單D中調用過ldap_bind函數後,我通過調用ldap_search函數來搜尋伺服器以獲得我需要的資訊。ldap_search函數有 多個參數,不過,我們這裡只使用了前三個參數。我向搜尋函數傳遞了ldap connection、search base和filter參數,這樣該函數就會正確使用者名稱下以及支援的搜尋範圍和過濾條件下對伺服器進行搜尋。簡而言之,就是我指定uid來指示使用者名稱說明 搜尋的使用者。這樣LDAP伺服器就會過濾搜尋結果,僅僅返回該使用者自己的LDAP資訊。

學習過程
當我 第一次開始用PHP的LDAP擴充時候,我對ldap_search函數只返回資源而不是一個數組或者字串而迷惑不解。當我學會用 ldap_get_entries函數來擷取搜尋的實際結果時,我才明白過來。ldap_get_entries函數的一個優點就是它把搜尋結果作為一個 多維陣列來返回。就是說,我把搜尋結果存到一個名為$ldap[‘info’]的數組中,這看起來挺讓人迷惑的。

由於在多維陣列中有我搜尋的結果,我可以任意處理這些資料。我把使用者的部門和電子郵件地址儲存到session變數中,以便在本次session的稍後時候用上。

當這些事情都做完之後,我用ldap_close函數關閉串連。關閉函數可以釋放串連資源。該函數還有一個別名ldap_unbind,它們實際上是同一個函數。

一個很好的出發點
儘管我對LDAP擴充中的其它函數有很多接觸,我列出的函數對你初學LDAP身份認證來說已經夠用了。PHP和LDAP的聯合為基於Web的應用程式提 供了一種通用的驗證使用者身份的方法。LDAP伺服器允許管理員對使用者授權訪問許可,它也可以允許或者拒絕應用程式對資料的訪問。

轉自:http://www.zxbc.cn/html/20080712/61985.html

在Windows和UNIX下利用PHP和LDAP進行身分識別驗證

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.