LDAP搜索过滤器全面解析

#作者:朱雷

一、LDAP 简介

1.1. 什么是目录服务

目录是专门为搜索和浏览而设计的专用数据库,此外还支持基本的查找和更新功能。目录服务是由目录数据库和一套访问协议组成的系统。
它成树状结构组织数据,类似文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据,所以目录天生是用来查询的。
目录往往包含描述性、基于属性的信息,并支持复杂的过滤功能。目录通常不支持用于处理大量复杂更新的数据库管理系统中的复杂事务或回滚方案。如果允许的话,目录更新通常是简单的全有或全无更改。目录通常经过调整,可以快速响应大量查找或搜索操作。它们可能能够广泛复制信息,以提高可用性和可靠性,同时减少响应时间。复制目录信息时,消费者之间的暂时不一致可能是可以接受的,只要及时解决不一致问题即可。

1.2. 什么是 LDAP

LDAP代表轻量级目录访问协议顾名思义,它是一种用于访问目录服务的轻量级协议,基于特定的X.500标准的目录服务。

1.3. LDAP的基本模型

目录树概念

  1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
  2. 条目:每个条目就是一条记录,每个条目有自己的全局唯一属性集合可区别的名称(DN)。
  3. 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
  4. 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。

关键字说明

关键字英文全称含义
dcDomain Component域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)
uidUser Id用户ID bobs.li(一条记录的ID)
ouOrganization Unit组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
cnCommon Name公共名称,如“Thomas Johansson”(一条记录的名称)
snSurname姓,如“李”
dnDistinguished Name“uid=bobs.li,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)
rdnRelative dn相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

二、搜索过滤器

2.1. 简介

搜索过滤器选择要为搜索操作返回的条目。它们最常与 ldapsearch 命令行工具一起使用。使用 ldapsearch 时,文件中可以有多个搜索过滤器,每个过滤器在文件中的单独行中,或者直接在命令行中指定搜索过滤器。

2.2. 基本语法格式

搜索过滤器的基本语法为:
(<属性><比较运算符><值>)
其中 “比较运算符” 被称为Operator

2.3. 在搜索过滤器中使用 Operator

搜索过滤器中的 operator 会设置属性和给定搜索值之间的关系。
例:
“(employeeNumber>=500)”
“(sn~=suret)”
“(salary<=150000)”

2.4. 搜索过滤器 Operator 表

搜索过滤器 Operator 表

搜索类型Operator描述
相等=返回包含与指定的值完全匹配的条目。例如,cn=example
子字符串=string* string返回包含包含指定子字符串的属性的条目。例如,cn=exal。星号 () 表示零 (0) 或多个字符。
大于或等于>=返回包含大于或等于指定的值的属性的条目。例如,uidNumber >= 5000。
小于或等于<=返回包含小于或等于指定的值的属性的条目。例如,uidNumber <= 5000。
存在=*返回包含指定属性的一个或多个值的条目。例如: cn= the。
大约~=返回包含指定属性的条目,其值大约等于搜索过滤器中指定的值。例如,l~=san fransico 可以返回 l=san francisco。
通配符(wildcard)*通配符,匹配任意字符
- 假设用户目录树ou=username,dc=domain,结构如下:
dc=domain
      |-ou=username
            |-cn=xiaoming
            |-cn=xiaojun
            |-cn=xiaogang
            |-cn=xiaotian

用户信息属性如下:

cn=xiaoming
objectClass=top
objectClass=person
name=xiaoming
sex=male
age=30
pwd=xxxxx
email=xiaoming@126.com
desc=team leader
查询所有name为xiaoming,sex为male的用户:
(&(name=xiaoming)(sex=male))
 查询所有age不为30的用户:
(!(age=30))
  查询所有age为30,并且name不为xiaoming的用户:
(&(age=30)(!(name=xiaoming)))
  查询所有age为30,或者name为xiaoming的用户:
(|(age=30)(name=xiaoming))
  查询所有有email为空的用户:
(email=)
  查询所有没有desc属性的用户:
(!(desc=*))
  查询所有有desc属性的用户:
(desc=*)

2.5. 使用复合搜索过滤器

搜索过滤器布尔值 Operator表

Operator符号描述
&所有指定的过滤器都必须为 true,才能为 true。例如,(& (filter) (filter) (filter)…)。
或者至少一个指定的过滤器必须为 true,声明必须为 true。例如,(
对于该语句,指定语句不能为 true。只有一个过滤器会受到 not 运算符 的影响。例如,(!(filter)).

布尔值表达式会按照以下顺序评估:

  • 首先Innerest to outerest(从内到外) 父项表达式。
  • 从左到右的所有表达式。

可以使用布尔值运算符组合多个搜索过滤器组件,如下所示:
(Boolean-operator(filter)(filter)(filter)…)

例如,此过滤器返回不包含指定的值的所有条目
(!(objectClass=person))

当将复合搜索过滤器嵌套到已完成的表达式中时,复合搜索过滤器最有用:
(Boolean-operator(filter)((Boolean-operator(filter)(filter)))

这些复合过滤器可以与其他类型的搜索(大约、子字符串、其他运算符)相结合,以获得非常详细的结果。例如,这个过滤器返回其组织单元为Marketing
且其 description 属性不包含子字符串 X.500 的所有条目:
(&(ou=Marketing)(!(description=X.500)))

可以扩展该过滤器,以返回其机构单元为 Marketing,没有子字符串 X.500,并且 example 或 demo 设置为 manager 的条目:

(&(ou=Marketing)(!(description=*X.500*))(|(manager=cn=example,ou=Marketing,dc=example,dc=com)(manager=cn=demo,ou=Marketing,dc=example,dc=com)))

此过滤器返回没有代表个人且其通用名称与 printer3b 类似的所有条目:
(&(!(objectClass=person))(cn~=printer3b))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值