2011-05-18 15 views
6

Estoy buscando crear una aplicación basada en web en PHP que reciba solicitudes LDAP y devuelva respuestas LDAP, pero en realidad no utiliza un servidor LDAP. Específicamente, me gustaría que la tabla de contactos en una base de datos MySQL esté disponible para Thunderbird como una libreta de direcciones LDAP.Creación de un servidor LDAP con PHP

dos preguntas:

  1. ¿Existe una biblioteca existente para la implementación de un servidor LDAP con PHP? (El paquete PHP_LDAP es para crear un cliente LDAP, donde la aplicación PHP se conecta a un servidor LDAP existente.)

  2. ¿Cómo se obtienen realmente los datos LDAP del cliente en mi script? ¿LDAP viaja a través de HTTP? Cuando la solicitud se presentara en:

    $HTTP_RAW_POST_DATA 
    

o similar? ¿Puede Apache manejar las solicitudes LDAP y pasarlas a mi script o es un protocolo completamente diferente que requiere una aplicación de "escucha" diferente para manejar?

+2

OpenLDAP se puede configurar para [utilizar una base de datos SQL como back-end] (http://www.openldap.org/doc/admin24/backends.html) directamente. No es tan completo como el BDLD de OpenLDAP nativo, pero podría satisfacer sus necesidades sin una línea de PHP. (¿Cuál no sería mi primera opción de lenguaje de implementación para un nuevo servidor LDAP, no por una gran posibilidad :) :) – sarnold

+0

Había intentado volver al trabajo de sql hace un tiempo, pero finalmente me rendí porque ni siquiera podía conseguirlo compilar correctamente Básicamente tenemos un CRM basado en PHP/MySQL, y de alguna manera tenemos que hacer que los contactos estén disponibles para Thunderbird como una libreta de direcciones. Supongo que podríamos usar un servidor LDAP real y hacer que nuestro CRM (como cliente) actualice la base de datos LDAP, pero eso parece realmente ineficiente. Me pregunto si sería más fácil crear un complemento de libreta de direcciones JSON para Thunderbird, y omitir LDAP por completo. – Nick

Respuesta

3

El protocolo LDAP no es manejado nativamente por Apache, y no he visto ningún módulo Apache que maneje ese protocolo. No creo que puedas hacerlo usando PHP a través de Apache. Es posible que pueda implementar un servidor PHP puro (consulte http://php.net/manual/en/function.stream-socket-server.php) y luego implemente el analizador de paquetes de protocolo LDAP en PHP también. No creo que haya un analizador ASN1 nativo para PHP, pero es posible que puedas encontrar uno en C e integrarlo de alguna manera.

+0

Eso es desafortunado. Parece que sería mucho más trabajo de lo que vale la pena implementar un servidor LDAP en PHP. Voy a analizar la posibilidad de modificar Thunderbird para obtener datos de dirección a través de solicitudes JSON o XML a través de http (s). – Nick

+0

Ah: si eso es lo que estás buscando, tal vez algo como gContactsSync (ver http://gcontactsync.mozdev.org/) te dará una base para comenzar. – Femi

+1

Ah: me llevó una eternidad encontrarlo, pero es posible que desee ver a Penrose (ver http://penrose.redhat.com/display/PENROSE/Home), que está en Java pero (en teoría) le permite volver a ldap con cualquier estructura de almacenamiento (para que escribas un adaptador en el back-end de tu libreta de direcciones y Penrose lo expone a través de LDAP), – Femi

0

Hace un tiempo trabajé con un desarrollador muy inteligente que dijo que implementó un cliente/servidor LDAP en PHP. Lo publicó bajo la licencia del MIT aquí: https://code.google.com/p/ldap-php/.

No tengo idea de lo que es el estado de esto.

0

Es posible crear un servidor LDAP de PHP puro con esta biblioteca (lo escribí inicialmente para fines cliente LDAP):

https://github.com/FreeDSx/LDAP

Funciona sobre la base de un controlador de solicitudes (sólo una interfaz) para las solicitudes de los clientes. Básicamente, extiendes una clase que gestionará las solicitudes de los clientes y enviará una respuesta de vuelta (en el caso de una búsqueda de todos modos).Un ejemplo básico:

  1. Crear un controlador de solicitudes extender el administrador de solicitud genérica en la biblioteca:
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', 
      ]) 
     ); 
    } 
} 
  1. Utilizando el controlador de solicitudes, cree un servidor LDAP proceso que escucha en el puerto 389 para los clientes:
use FreeDSx\Ldap\LdapServer; 
use Foo\LdapRequestHandler; 

$server = new LdapServer([ 'request_handler' => LdapRequestHandler::class ]); 
$server->run(); 

hay más documentos sobre el borrador del servidor por componentes de la biblioteca aquí:

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

algunas advertencias a esto:

  • Actualmente no hay soporte de paginación/VLV para el servidor
  • Actualmente no hay manera de volver controles del controlador de solicitudes de vuelta al cliente.
Cuestiones relacionadas