php - 使用 PHP 创建 LDAP 服务器

标签 php ldap

我想用 PHP 创建一个基于 Web 的应用程序,它接收 LDAP 请求并发回 LDAP 响应,但实际上并不使用 LDAP 服务器。具体来说,我想将 MySQL 数据库中的联系人表作为 LDAP 地址簿提供给 Thunderbird。

两个问题:

  1. 是否有用于使用 PHP 实现 LDAP 服务器的现有库? (PHP_LDAP 包用于创建 LDAP 客户端,其中 PHP 应用程序连接到现有的 LDAP 服务器。)

  2. LDAP 数据实际上是如何从客户端获取到我的脚本中的? LDAP 是否通过 HTTP 传输?请求将出现在:

    $HTTP_RAW_POST_DATA
    

或类似的? Apache 可以处理 LDAP 请求并将它们传递到我的脚本中,还是它是一个完全不同的协议(protocol),需要不同的“监听器”应用程序来处理?

最佳答案

可以用这个库创建一个纯 PHP LDAP 服务器(我最初写它是为了 LDAP 客户端):

https://github.com/FreeDSx/LDAP

它在客户端请求的请求处理程序(只是一个接口(interface))的基础上工作。基本上,您扩展了一个类,该类将处理客户端请求并发回响应(无论如何在搜索的情况下)。一个基本的例子:

  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',
            ])
        );
    }
}
  1. 使用请求处理程序,创建一个在端口 389 上监听客户端的 LDAP 服务器进程:
use FreeDSx\Ldap\LdapServer;
use Foo\LdapRequestHandler;

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

这里有更多关于库的服务器组件的文档:

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

一些注意事项:

  • 目前服务器不支持分页/vlv
  • 目前无法将控制权从请求处理程序返回给客户端。

关于php - 使用 PHP 创建 LDAP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6039602/

相关文章:

java - 使用 maven 时用于开发环境与部署的不同 spring XML 文件

php - 为什么这个查询总是在 phpmyadmin 中工作,但在我的 php pdo 代码上有时工作?

php - “添加图片”选项到图片库?

php - 如何控制PHP多页表单的流程?

javascript - 在 Javascript 中解析来自 PHP 的编码数据

Java LDAP 密码验证

java - 从 JAVA 在 OpenDJ (LDAP) 中创建新的对象类

java - 是否可以将ldap服务器直接连接到Android手机?

php - 带授权的本地http请求

RegEx:获取多行 LDAP 条目