草庐IT

php - ZF2 ldap分页

coder 2024-05-03 原文

我在使用 LDAP 库和 Active Directory 时遇到了一些问题。由于 AD 的限制,如果参数将返回超过 1000 个结果,我将无法使用 LDAP 库进行搜索。此外,似乎没有办法使用 ZF2 LDAP 库对结果进行分页。我知道如何分页,但我宁愿使用 ZF2 内置 方法(如果存在的话)。

我是否遗漏了什么,或者我是否必须创建自己的方法来实现这一点?

附言我查看了手册和代码,但看不到任何实现此目的的方法。

最佳答案

这就是我为解决这个问题所做的

/**
 * An LDAP search routine for finding information and returning paginated results
 *
 * Options can be either passed as single parameters according to the
 * method signature or as an array with one or more of the following keys
 * - filter
 * - baseDn
 * - scope
 * - attributes
 * - sort
 * - collectionClass
 * - sizelimit
 * - timelimit
 *
 * @param  string|Filter\AbstractFilter|array $filter
 * @param  string|Dn|null                     $basedn
 * @param  array                              $attributes
 * @param  string|null                        $sort
 * @param  string|null                        $collectionClass
 * @param  integer                            $timelimit
 * @param  integer                            $pageSize
 * @return Array
 * @throws Exception\LdapException
 */
public function multiPageSearch(
    $filter, $basedn = null, array $attributes = array(), $sort = null,
    $collectionClass = null, $timelimit = 0, $pageSize = 1000
)
{
    if (is_array($filter)) {
        $options = array_change_key_case($filter, CASE_LOWER);
        foreach ($options as $key => $value) {
            switch ($key) {
                case 'filter':
                case 'basedn':
                case 'scope':
                case 'sort':
                    $$key = $value;
                    break;
                case 'attributes':
                    if (is_array($value)) {
                        $attributes = $value;
                    }
                    break;
                case 'collectionclass':
                    $collectionClass = $value;
                    break;
                case 'sizelimit':
                case 'timelimit':
                    $$key = (int) $value;
                    break;
            }
        }
    }

    if ($basedn === null) {
        $basedn = $this->getBaseDn();
    } elseif ($basedn instanceof Dn) {
        $basedn = $basedn->toString();
    }

    if ($filter instanceof Filter\AbstractFilter) {
        $filter = $filter->toString();
    }

    $resource = $this->getResource();

    $results = new \ArrayIterator;

    Stdlib\ErrorHandler::start(E_WARNING);
    $cookie = '';
    do {
        ldap_control_paged_result($resource, $pageSize, true, $cookie);

        $result  = ldap_search($resource, $basedn, $filter, $attributes, 0, $pageSize, $timelimit);

        if ($sort !== null && is_string($sort)) {
            $isSorted = ldap_sort($resource, $result, $sort);

            if ($isSorted === false) {
                throw new Exception\LdapException($this, 'sorting: ' . $sort);
            }
        }

        $entries = new \ArrayIterator(ldap_get_entries($resource, $result));

        foreach ($entries as $e) {
            $results[] = $e;
        }

        ldap_control_paged_result_response($resource, $result, $cookie);
    } while($cookie !== null && $cookie != '');
    Stdlib\ErrorHandler::stop();

    if ($results->count() == 0) {
        throw new Exception\LdapException($this, 'searching: ' . $filter);
    }

    return $results;
}

这个类/方法是为了扩展 Zend\Ldap\Ldap 类,它将允许返回超过 1000 个结果,但不会以与 Ldap::search 方法相同的格式返回它们。

关于php - ZF2 ldap分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892693/

有关php - ZF2 ldap分页的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 每个页面上的 Jekyll 分页 - 2

    据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b

  3. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  4. ruby-on-rails - Ruby on Rails 3: Devise::LdapAdapter.get_ldap_param 未定义方法错误 - 2

    我正在运行:ruby1.9.3p0,rails3.1.1,设计1.4.9,Devise_ldap_authenticatable0.4.10我正在使用Devise通过ldap服务器验证我的Rails应用程序。我使用用户名而不是电子邮件进行身份验证,所以我表中的电子邮件字段自然是空白的。在ldap中查询email,官方的做法是在用户模型中加入这段代码:before_save:get_ldap_emaildefget_ldap_emailself.email=Devise::LdapAdapter.get_ldap_param(self.username,"mail")end这段代码失败了

  5. Streampark集成Cloudera Flink、ldap、告警,以及部署常见问题 - 2

    集成背景我们当前集群使用的是ClouderaCDP,Flink版本为ClouderaVersion1.14,整体Flink安装目录以及配置文件结构与社区版本有较大出入。直接根据Streampark官方文档进行部署,将无法配置FlinkHome,以及后续整体Flink任务提交到集群中,因此需要进行针对化适配集成,在满足使用需求上,尽量提供完整的Streampark使用体验。集成步骤版本匹配问题解决首先解决无法识别Cloudera中的FlinkHome问题,根据报错主要明确到的事情是无法读取到Flink版本、lib下面的jar包名称无法匹配。修改对象:修改源码:(解决无法匹配clouderajar

  6. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  7. ruby-on-rails - Rails 应用程序作为 LDAP 或 CardDAV 服务器? - 2

    我正在开发一个内部Rails应用程序,这是一个(除其他外)CRM应用程序,因此它包含客户和其他联系人的姓名、地址等。一个巧妙的功能是允许客户端(例如电子邮件程序和地址簿应用程序)获取/搜索这些联系人(即只是简单的只读访问)。我的想法是为此使用LDAP或CardDAV,但我无法获得有关如何实现它的太多(最近)信息。对于CardDAV,我基本上什么都没发现。对于LDAP,我发现了大量LDAP客户端gem和插件,但只有少数LDAP服务器实现。到目前为止我发现的是theplainRubyLDAPserver和LDAP-ActiveRecord-gateway,它建立在前者之上。后者听起来很合适

  8. ruby-on-rails - PHP 魔术方法 __call、__get 和 __set 的 Ruby 等价物 - 2

    我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob

  9. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

    Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

  10. ruby-on-rails - 在 Rails 应用程序中使用 Active Directory/LDAP 组获取权限\角色的示例 - 2

    我想知道其他人是如何实现这个场景的。我有一个内部Rails应用程序(库存管理、标签打印、运输等)。我正在重写系统的安全性,导致旧方法变得难以维护(用户表、密码、角色)——我使用了restful_authentication和角色。它是大约3年前实现的。我已经使用ruby​​-ldap-net实现了AuthLogic来对用户进行身份验证(与我之前与其他框架/语言的挣扎相比,实际上这非常容易)。下一步是角色。我已经在ActiveDirectory中定义了组——所以我不想在我的Rails应用程序中运行一个单独的角色系统,我只想重用ActiveDirectory组——因为系统的那一部分已经被维

随机推荐