2011-05-18 113 views
6

我正在尋找在PHP中創建基於Web的應用程序,該應用程序接收LDAP請求併發回LDAP響應,但實際上並未使用LDAP服務器。具體而言,我想將MySQL數據庫中的聯繫人表作爲LDAP地址簿提供給Thunderbird。使用PHP創建LDAP服務器

兩個問題:

  1. 是否有實現與PHP LDAP服務器現有的庫? (PHP_LDAP包用於創建LDAP客戶端,其中PHP應用程序連接到現有的LDAP服務器。)

  2. LDAP數據如何實際從客戶端獲取到腳本中? LDAP是否通過HTTP傳輸?

    $HTTP_RAW_POST_DATA 
    

或類似:凡請求將在顯示? Apache可以處理LDAP請求並將它們傳遞給我的腳本,還是完全不同的協議,需要不同的「監聽器」應用程序來處理?

+2

OpenLDAP可以直接配置爲[使用SQL數據庫作爲後端](http://www.openldap.org/doc/admin24/backends.html)。它不像原生OpenLDAP BDB那樣功能全面,但可能不需要一行PHP即可滿足您的需求。 (這不會是我的新的LDAP服務器的實現語言的第一選擇,而不是一個遠射。:) – sarnold 2011-05-18 03:50:33

+0

我曾嘗試讓back-sql工作一段時間,但最終放棄了,因爲我甚至無法得到它妥善編譯。基本上我們有一個基於PHP/MySQL的CRM,不知何故,我們需要將聯繫人作爲通訊錄提供給Thunderbird。我想我們可以使用一個真正的LDAP服務器,讓我們的CRM(作爲客戶端)更新LDAP數據庫,但這看起來效率很低。我想知道爲Thunderbird創建JSON地址簿插件是否更容易,並且完全跳過LDAP? – Nick 2011-05-18 17:50:16

回答

3

LDAP協議本身不是由Apache處理的,我還沒有看到任何處理該協議的Apache模塊。我不相信你可以通過Apache使用PHP。您可能能夠實現純PHP服務器(請參閱http://php.net/manual/en/function.stream-socket-server.php),然後在PHP中實現LDAP協議數據包解析器。我不相信PHP有一個本地的ASN1解析器,但是你可能能夠在C中找到一個並以某種方式整合它。

+0

這很不幸。這聽起來似乎比在PHP中實現LDAP服務器更有價值。我將研究修改Thunderbird以通過http(s)通過JSON或XML請求獲取地址數據的可能性。 – Nick 2011-05-18 17:53:32

+0

啊:如果這就是你正在尋找的東西,也許像gContactsSync(見http://gcontactsync.mozdev.org/)會爲你提供一個基礎。 – Femi 2011-05-18 19:23:16

+1

啊:帶我永遠找到它,但你可能想看看彭羅斯(請參閱http://penrose.redhat.com/display/PENROSE/Home),這是在Java中,但(理論上)讓你回到ldap與任何存儲結構(所以你寫一個適配器到你的通訊錄後端和彭羅斯公開它通過LDAP), – Femi 2011-05-18 19:39:36

0

後來我和一位非常聰明的開發人員合作,他說他在PHP中實現了一個可用的LDAP客戶機/服務器。他在MIT的許可證下發布了它:https://code.google.com/p/ldap-php/

我不知道這是什麼狀態。

0

它可以創建與此庫純PHP LDAP服務器(我寫它最初是爲LDAP客戶端的目的):

https://github.com/FreeDSx/LDAP

它的工作原理的請求處理器(只是一個接口)的基礎上,爲客戶請求。基本上,你擴展了一個類來處理客戶端請求併發迴響應(無論如何都是搜索)。一個基本的例子:

  1. 創建請求處理機延伸在庫中的通用請求處理程序:
namespace Foo; 

use FreeDSx\Ldap\Server\RequestHandler\GenericRequestHandler; 

class LdapRequestHandler extends GenericRequestHandler 
{ 
    /** 
    * @var array 
    */ 
    protected $users = [ 
     'user' => '12345', 
    ]; 

    /** 
    * Validates the username/password of a simple bind request 
    * 
    * @param string $username 
    * @param string $password 
    * @return bool 
    */ 
    public function bind(string $username, string $password): bool 
    { 
     return isset($this->users[$username]) && $this->users[$username] === $password; 
    } 

    /** 
    * Override the search request. This must send back an entries object. 
    * 
    * @param RequestContext $context 
    * @param SearchRequest $search 
    * @return Entries 
    */ 
    public function search(RequestContext $context, SearchRequest $search): Entries 
    { 
     // Do your logic here with the search request, return entries... 
     return new Entries(
      Entry::create('cn=Foo,dc=FreeDSx,dc=local', [ 
       'cn' => 'Foo', 
       'sn' => 'Bar', 
       'givenName' => 'Foo', 
      ]), 
      Entry::create('cn=Chad,dc=FreeDSx,dc=local', [ 
       'cn' => 'Chad', 
       'sn' => 'Sikorra', 
       'givenName' => 'Chad', 
      ]) 
     ); 
    } 
} 
  • 使用請求處理程序,創建一個LDAP服務器過程在端口389偵聽客戶:
  • use FreeDSx\Ldap\LdapServer; 
    use Foo\LdapRequestHandler; 
    
    $server = new LdapServer([ 'request_handler' => LdapRequestHandler::class ]); 
    $server->run(); 
    

    有在服務器比較多文檔圖書館的onent這裏:

    https://github.com/FreeDSx/LDAP/tree/master/docs/Server

    一些注意事項,以這樣的:

    • 目前國內還沒有針對服務器
    • 目前沒有辦法從請求處理程序返回控制回分頁/ VLV支持給客戶。