gpt4 book ai didi

java - LDAP绑定(bind)与搜索

转载 作者:IT王子 更新时间:2023-10-29 00:55:43 26 4
gpt4 key购买 nike

LDAP新手。我计划使用UnboundID Java API通过非常慢的链接检查LDAP服务器中〜5K条目的存在。一种是,我可以使用适当的LDAP搜索选项。或通过绑定(bind)到条目的DN来确定条目的存在。 Plz建议,这是最快/最好的方法。

最佳答案

您绝对不应仅仅为了确定条目是否存在而执行绑定(bind)。有两个非常好的原因:

  • 对于您尝试以不存在的用户身份进行绑定(bind)的情况以及尝试使用错误密码进行绑定(bind)的情况,符合标准的LDAP服务器都应返回“无效凭据”响应。因此,如果您不知道用户的密码(如果您甚至都不知道该用户是否存在,这是一个不错的选择),那么您将无法使用绑定(bind)来区分丢失的用户和输入错误的用户密码。
  • 绑定(bind)尝试可能导致对目标条目的写入,这可能会大大降低性能。如果尝试使用错误的密码绑定(bind),则服务器可能配置为跟踪失败的身份验证尝试,在某些情况下甚至可能锁定用户。即使您使用正确的密码绑定(bind),服务器也可能配置为更新条目(例如,记录上次登录时间)。

  • 您还可以考虑其他一些选择。它们包括:
  • 正如Terry所建议的那样,使用请求的属性集“1.1”(表示没有属性)对每个条目(LDAPConnection.getEntry方法所做的事情)执行基本级别的搜索。如果该条目不存在,您将得到“没有这样的对象”结果(这将导致LDAP SDK抛出LDAPException)。如果该条目确实存在,那么您将只返回其DN的搜索结果条目,然后返回搜索结果完成的响应。
  • 作为使用基本级搜索的替代方法,您可以使用LDAP比较操作。如果您只想知道条目是否存在,这比搜索更有效,因为每个条目只有一个响应(比较结果),而不是两个(搜索结果条目和完成的搜索结果)。如果该条目存在,则根据该条目是否匹配比较断言,您将获得“比较为真”或“比较为假”的响应。如果该条目不存在,那么您将获得一个LDAPException,结果为“no such object”。
  • 如果您使用的服务器支持entryDN操作属性(如RFC 5020中所述),则可以执行单个搜索,该搜索可用于检索多个条目。例如,您可以构造一个过滤器,例如“(|(entryDN = uid = user.1,dc = example,dc = com)(entryDN = uid = user.2,dc = example,dc = com)(entryDN = uid = user.3,dc = example,dc = com)(entryDN = uid = user.4,dc = example,dc = com)(entryDN = uid = user.5,dc = example,dc = com))“。此示例将针对单个搜索请求,该请求可用于确定这五个条目中的哪个条目存在。您将拥有一个请求,该请求最多包含五个搜索结果条目响应和一个搜索结果完成响应,而不是针对每个条目分别进行请求和响应。我绝对不建议构造包含5000个元素的OR过滤器,但是您仍然可以使用它来显着减少需要执行的搜索请求的数量。
  • 如果您使用的目录没有比您要检查的目录更多的条目,那么您可以简单地创建一个包含您要查找的DN的集合,执行子树“(objectClass = *)搜索,然后从服务器返回的集合中删除每个条目的DN。搜索完成后,集合中剩下的条目将是服务器中不存在的条目。当然,如果您只想在包含大量条目的服务器中检查少数条目,那将是一个非常糟糕的主意。

  • 请注意,在最后两种情况下,您将基于是否在一组搜索结果中返回了条目来确定条目是否存在,您还将受到访问控制限制。如果您用来绑定(bind)到服务器的帐户没有权限查看您要检查的所有条目,那么您可能会错误地认为该条目不存在,仅仅是因为客户端不存在有权查看它。相反,如果您没有进行检查的权限,则前两种方法可能会返回“访问权限不足”的结果,因此这也可能阻止您进行确定。最终,这意味着您应该使用一个您肯定有权限的帐户来查看需要进行确定的所有条目。

    关于java - LDAP绑定(bind)与搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16077473/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com