我在使用 OpenLDAP 和 Spring security 时遇到了一些问题,后者使用 dn(过滤器)中的完整路径和空基进行搜索。OpenLDAP 不喜欢这样,查询会失败。问题是我无法控制查询,因此我想知道是否可以配置 OpenLDAP 以允许此类查询。
关于其工作原理的一些细节:
Spring 首先搜索用户,如下所示:
base:ou=something,ou=something,dc=oh,dc=my,dc=god
filter:cn=someUsername
然后,它会返回一个结果,其中输入了整个 dn,并且 base 是一个空字符串,如下所示:
base:
filter:cn=someUsername,ou=something,ou=something,dc=oh,dc=my,dc=god
然后,它使用该结果对 LDAP 进行新的搜索,但搜索失败。
答案1
OpenLDAP 需要知道基本 DN,以便它能够选择从哪个数据库读取。我找不到任何支持跨所有数据库进行“全局”搜索的功能。
但是,您可以添加一个具有空基本 DN 的新数据库。借助relay
后端,它可以将所有查询转发到您的主数据库。请参阅slapd-relay(5)以获得更详细的例子(甚至包括重写),但一般用法是:
database relay
suffix ""
relay "dc=example,dc=org"
dn: olcDatabase=relay,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcSuffix:
olcRelay: dc=example,dc=org
(另外,我想知道 Spring 是否真的使用空基数来全部搜索?有些程序以这种方式获取根 DSE(位于基数“”,范围‘基数’),以便自动发现真实的基 DN 和/或服务器功能。)
更新后,似乎真正的问题是 Spring 使用坏过滤器。仅发送 DN 作为过滤器是没有意义的,因为您实际上最终会搜索cn
包含 的someUsername,ou=something,dc=something
。
相反,Spring 应该使用 DN 作为根据:
base: cn=someUsername,ou=something,ou=something,dc=oh,dc=my,dc=god
scope: base
filter: (objectClass=*)
如果有必要按 DN 过滤,我认为一个可行的方法是,例如,尽管它在服务器之间有所不同(entryDN 是 OpenLDAP 特定的,而 AD 有 distinguishedName,等等)。(entryDN=dn)
(entryDN=cn=foo,ou=bar,ou=baz)