Finalmente descobri isso. Existem várias partes diferentes para fazer isso funcionar.
Primeiro as 2 regras da ACL:
Access to dn.base="dc=example,dc=com" by \
dn.base="uid=testuser,ou=people,dc=example,dc=com" \
search
Access to dn.one="ou=people,dc=example,dc=com" \
attrs=entry,uid,cn,sn,gecos,mail,uidNumber,gidNumber by \
dn.base="uid=testuser,ou=people,dc=example,dc=com" \
read
- A ordem das regras não importa porque estamos usando
dn.base
no 'acesso a' para a primeira regra. Se fosse 'dn.children', a ordem importaria. - A primeira regra concede acesso de pesquisa de
uid=testuser
adc=example,dc=com
, mas nada mais. Sem a segunda regra, tudo o que voltaria era se a busca correspondia ou não a algo, não ao que correspondia. - A segunda regra concede
uid=testuser
acesso de leitura aou=people
e os filhos um nível de profundidade (dn.one
). A capacidade de pesquisa está incluída na permissão de leitura. - O
entry
attr é importante na segunda regra, pois a realização de uma pesquisa exige que o acesso a esse atributo seja compatível com a entrada. - Quando a entrada for correspondida, a pesquisa retornará com todos os outros atributos permitidos.