Passei algum tempo pesquisando a documentação sobre conjuntos e o problema que você Os operadores de set (como & ) realmente funcionam apenas com dados do mesmo tipo ... assim, você pode pedir a interseção de um DN e um DN, ou um valor de atributo e uma string, mas interseções de coisas de diferentes tipos não fazem sentido.
Então, criamos uma string usando o atributo isAdmin e as maravilhas da concatenação de strings, assim:
olcAccess: {1}to dn.regex="o=([^,]+),ou=cust,dc=some,dc=domain$"
by set.expand="([admin=] + user/isAdmin + [,] + user/-1) & ([admin=TRUE] + [,o=$1,ou=cust,dc=some,dc=domain])" write
by * break
Observe o usuário de set.expand , porque queremos usar $1 na definição do conjunto e observe o uso de [...] para colocar valores literais nas sequências que estamos avaliando.
Para alguém conectado como minion1 , isso solicitará a interseção de:
admin=TRUE,o=mycompany,ou=cust,dc=some,dc=domain
e o valor literal:
admin=TRUE,o=mycompany,ou=cust,dc=some,dc=domain
Qual é um conjunto não vazio, então funciona. Para alguém com isAdmin=FALSE (ou nenhum atributo isAdmin ), a comparação seria com admin=FALSE,... ou admin=,... . Da mesma forma, para alguém que não esteja na mesma organização o=... do destino, a interseção produzirá um conjunto vazio.
Se você estiver interessado, isso é o que eu realmente usei para testar. Eu estou usando employeeType em vez de isAdmin porque eu não queria mexer com a adição de um novo atributo ao meu esquema.
Além disso, slapd -dacl ... é seu amigo.