【问题标题】:LDAP: how to create search filters for nested attributes and values?LDAP:如何为嵌套的属性和值创建搜索过滤器?
【发布时间】:2017-11-20 10:31:18
【问题描述】:

我了解如何根据简单的属性创建 ldap 搜索过滤器,例如

(&(objectClass=universityPerson)(surname=Smith*))

将返回姓氏以“Smith”开头的大学人员的精美列表。到目前为止一切顺利!

在我们大学的 LDAP 架构中,人们有许多自定义属性或子对象,它们的结构类似于

graduateStatus: {campus=CAMPUS_CODE}:{degSchool=SCHOOL_CODE}:{classYr=YYYY}

universityHR:
  {jobCategory=Staff}:
  {campus=CAMPUS_CODE}:
  {deptId=999999}:
  {deptGroup=COLLEGE_BUSINESS}:
  {deptDescription=Business Library}:
  {deptVicePresidentArea=PROVOST}:
  {jobcode=123456}:
  {jobFamily=123}:
  {emplStatus=A}:
  {regTemp=R}

通过 LDAP 查询来回答以下问题会非常有用:

  • “谁是商学院 1995 年班毕业的人?”
  • “护士学校的工作人员都是谁,jobCode=456789?”
  • “jobFamily=789 的主校区临时工作人员是谁?”

我希望能够创建引用这些子属性的 ldap 搜索过滤器,例如:

(&(objectClass=universityPerson)(graduateStatus.campus=BUS)(graduateStatus.classYr=1995))

(&(objectClass=universityPerson)(universityHR.regTemp=T)(universityHR.jobFamily=789))

但我不知道这是否可能,更不用说语法是什么了。

我怀疑这不是 LDAP 的好用例,我应该在其他企业系统中寻找此类问题的答案。然而,将企业目录用作比美化的电话簿更多的东西会非常方便。

挖掘各种发行版的 OpenLDAP.org 和 ldapsearch 文档并没有找到答案。每当我查找有关嵌套属性或层次结构的信息时,我都会找到大量有关嵌套 和成员资格查询的文档,但这不是这里的问题。

非常感谢您的建议。

【问题讨论】:

  • LDAP 不以任何形式或形式支持此功能,您也不应该。 “嵌套属性”应该是子对象。
  • 也许如果你展示你所反对的结构会更有意义,并且可以提出建议。
  • @EJP 我认为我在这里学到的是,这不是使用 LDAP 的好方法。案件结案!

标签: search filter ldap


【解决方案1】:

在不修改数据结构的情况下,我可以看到的 OpenLDAP 的唯一方法是开发一个可以让您执行此类请求的覆盖,但这不是一件容易的事;)

如果您可以修改数据结构或复制(并保持完整性)某些数据,您可以在用户组中扩展这些属性。

请求将同时查找属于多个组的用户。

例如:(&(objectClass=universityPerson)(universityHR.regTemp=T)(universityHR.jobFamily=789))

可能是:

(&(objectClass=universityPerson)(memberOf=cn=T,ou=regTemp,ou=universityHR,ou=group,dc=example,dc=com)(memberOf=uid=789,ou=jobFamily,ou=universityHR,ou=group,dc=example,dc=com))

像这样的树:

dc=example,dc=com
  `- ou=group
      `- ou=universityHR
         |- ou=jobFamily
         |   |- uid=789
         |   `- uid=987
         `- ou=regTemp
             |- cn=T
             `- cn=A

我能想到的最后一个想法是在 API 中进行这种过滤,并使用这种过滤器请求您的 API,然后让 API 发出所需的请求并聚合结果。

如果您可以发布自定义嵌套属性/子条目的 LDIF,看看有什么可能。

【讨论】:

  • @Estaban - 非常感谢您的回复。我想我在这里学到的是这不是使用 LDAP 的好方法。感谢您为这个答案付出的时间和精力!
  • @ThomasKnox 使用您当前的结构,对于像 graduateStatus= {campus=CAMPUS_CODE}:{degSchool=SCHOOL_CODE}:{classYr=YYYY} 这样的属性,您仍然可以制作像 (&(graduateStatus=*{campus=BUS}*)(graduateStatus=*{classYr=1995}*)) 这样的过滤器。它应该可以工作,但在性能方面,它不会很有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多