在Windows和UNIX下利用PHP和LDAP進行身份驗證(轉)

BSDLite發表於2007-08-11
在Windows和UNIX下利用PHP和LDAP進行身份驗證(轉)[@more@]  我現在的老闆曾要求我為企業內部網際網路的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)並適當介紹該函式的功能。
  
     // 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)對應。
  
     // 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伺服器發生的最後錯誤的資訊。
  
  在
  
     // 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伺服器的最後一條指令產生的錯誤資訊。如果你按給定使用者名稱和口令的繫結沒有成功登入,那麼錯誤資訊將包含這對無效的使用者名稱和口令。
  
  在我們的最後一個例子中
  
QUOTE:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-946652/,如需轉載,請註明出處,否則將追究法律責任。

在Windows和UNIX下利用PHP和LDAP進行身份驗證(轉)
請登入後發表評論 登入
全部評論

相關文章