2017-06-17 56 views
1

我了解如何基于简单的配件创建ldap搜索过滤器,例如LDAP:如何为嵌套的属性和值创建搜索过滤器?

(&(objectClass=universityPerson)(surname=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?”
  • “主要校园里工作家庭= 789的临时员工是谁?”

我希望能够创建LDAP搜索过滤器指的是那些子属性,是这样的:

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

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

,但我想不出如果这是可能的,更不用说语法可能是什么了。

我怀疑这不是LDAP的好用例,我应该在其他企业系统中寻找这些问题的答案。然而,将企业目录用作不仅仅是荣耀的电话簿是非常方便的。

通过OpenLDAP.org和ldapsearch文档搜索各种发行版并未得出答案。无论何时,当我寻找有关嵌套属性或层次结构的信息时,我都会发现大量关于嵌套和成员资格查询的文档,但这不是问题。

非常感谢您的任何建议。

+0

LDAP不以任何方式支持此形状或形式,您也不应该这样做。 '嵌套属性'应该是子对象。 – EJP

+0

也许如果你展示了你对付它的结构会更有意义,并且可以提出一个建议。 – jwilleke

+0

@EJP我想我在这里学到的是,这不是使用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来查看可能的结果。

+0

@Estaban - 非常感谢您的回复。我认为我在这里学到的是,这不是使用LDAP的好方法。我很欣赏你在这个答案中投入的时间和精力! –

+0

@ThomasKnox根据你现在的结构,对于像'graduationStatus = {campus = CAMPUS_CODE}:{degSchool = SCHOOL_CODE}:{classYr = YYYY}'这样的属性,你仍然可以像'(&(graduateStatus = * {campus = BUS} *)(graduateStatus = * {classYr = 1995} *))'。它应该工作,但性能明智,它不会非常有效。 – Esteban