You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LDAP搜索中基于当前日期过滤属性及排除日期属性小于当前日期用户的实现方法

LDAP搜索中基于当前日期过滤属性及排除日期属性小于当前日期用户的实现方法

嘿,这个问题我之前帮不少开发者踩过坑,其实核心就是构造正确的LDAP过滤规则,但第一步得先搞清楚你的LDAP服务器里日期属性的存储格式——这是最容易出错的地方!

大多数LDAP环境(比如OpenLDAP、Active Directory)里,日期属性都是以UTC时间字符串存储的,格式是YYYYMMDDHHMMSSZ(比如20240520123000Z,Z代表UTC时区)。少数AD场景下可能用FileTime格式(整数型的时间戳),但咱们先讲最通用的UTC字符串情况。

核心过滤逻辑

我们要排除「日期属性小于当前日期」的用户,反过来就是要筛选出「日期属性大于等于当前日期」或者「没有设置该日期属性」的用户。对应的LDAP过滤器写法有两种:

  1. 只保留日期属性≥当前日期的用户(不包含无属性的用户):
(&(objectClass=user)(!(yourDateAttribute < 20240520000000Z)))

这里的yourDateAttribute要替换成你实际使用的属性名,比如AD里的accountExpires(账户过期时间)。

  1. 保留日期属性≥当前日期以及没有设置该属性的用户:
    如果有些用户根本没配置这个日期属性,你想把他们也包含进来,就需要加上(!(yourDateAttribute=*))的条件:
(&(objectClass=user)(|(!(yourDateAttribute=*))(!(yourDateAttribute < 20240520000000Z))))

动态生成当前日期的LDAP格式字符串

手动写日期肯定不现实,得用脚本语言动态生成当前UTC时间的LDAP格式字符串,举两个常用的例子:

PowerShell(适合AD环境)

# 获取当前UTC时间并转换成LDAP格式
$currentUtcDate = Get-Date -Utc -Format "yyyyMMddHHmmssZ"
# 构造过滤器
$ldapFilter = "(&(objectClass=user)(!(accountExpires < $currentUtcDate)))"

Python(通用场景)

from datetime import datetime, timezone

# 生成当前UTC时间的LDAP格式字符串
current_utc = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%SZ")
# 构造过滤器
ldap_filter = f"(&(objectClass=user)(!(yourDateAttribute < {current_utc})))"

特殊场景注意事项

  • 如果是Active Directory的accountExpires属性:它有两个特殊值——09223372036854775807,都表示账户永不过期。如果要把这些用户也包含进来,过滤器需要调整成:
(&(objectClass=user)(|(accountExpires=0)(accountExpires=9223372036854775807)(!(accountExpires < 20240520000000Z))))
  • 如果你的日期属性是UNIX时间戳(比如OpenLDAP的shadowExpire):那需要先把当前日期转换成UNIX时间戳,再构造过滤器,比如:
(&(objectClass=posixAccount)(!(shadowExpire < 1716182400)))

这里的1716182400是2024年5月20日的UNIX时间戳。

  • 测试过滤器:建议先用LDAP浏览器(比如Apache Directory Studio)手动测试你的过滤器,确认逻辑正确后再写到代码里,避免因为格式错误导致搜索结果不符合预期。

备注:内容来源于stack exchange,提问作者Matoeil

火山引擎 最新活动