为了简便起见,本部分将用于提供绑定凭证的 ACI 关键字(如 userdn、roledn、groupdn 和 userattr)统称为 ACI 的主题。主题可确定应用 ACI 的对象。
下表显示可用于替换特定 ACI 关键字的宏。
表 7–1 宏 ACI 关键字
宏 |
描述 |
ACI 关键字 |
---|---|---|
($dn) |
用于在目标中进行匹配,并在主题中直接替换。 |
target、targetfilter、userdn、roledn、groupdn、userattr |
[$dn] |
用于替换在主题的子树中使用的多个 RDN。 |
targetfilter、userdn、roledn、groupdn、userattr |
($attr.attrName) |
用于将目标条目中的 attributeName 属性值替换到主题中。 |
userdn、roledn、groupdn、userattr |
宏 ACI 关键字具有以下限制:
在主题中使用 ($dn) 和 [$dn] 宏时,必须定义包含 ($dn) 宏的目标。
可以在主题中结合使用 ($dn) 宏(而非 [$dn] 宏)和 ($attr.attrName) 宏。
ACI 目标中的 ($dn) 宏通过比较自身与 LDAP 请求的目标条目来确定替换值。例如,您的 LDAP 请求将以下条目作为目标:
cn=all,ou=groups,dc=subdomain1, dc=hostedCompany1,dc=example,dc=com |
此外,您还具有按如下方式定义目标的 ACI:
(target="ldap:///ou=Groups,($dn),dc=example,dc=com") |
($dn) 宏与 "dc=subdomain1, dc=hostedCompany1" 相匹配。因此会将此子串用作 ACI 主题中的替换值。
在 ACI 的主题中,($dn) 宏将被替换为目标中匹配的整个子串。例如:
groupdn="ldap:///cn=DomainAdmins,ou=Groups,($dn),dc=example,dc=com" |
此主题将变为:
groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com" |
扩展宏之后,目录服务器将在完成普通进程后评估 ACI,以确定是否授予访问权限。
与标准 ACI 不同,使用宏替换的 ACI 不一定会授予对目标条目的子条目的访问权限。这是因为当目标为子 DN 时,替换可能不会在主题字符串中创建有效 DN。
[$dn] 的替换机制与 ($dn) 略有不同。将对目标资源的 DN 进行多次检查,每次都舍弃最左侧的 RDN 部分,直到找到匹配项为止。
例如,假定您的 LDAP 请求将 cn=all,ou=groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com 子树作为目标,并具有以下 ACI:
aci: (targetattr="*") (target="ldap:///ou=Groups,($dn),dc=example,dc=com") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn], dc=example,dc=com";) |
服务器将按如下方式继续操作,以扩展此 ACI:
服务器验证目标中的 ($dn) 是否与 dc=subdomain1,dc=hostedCompany1 相匹配。
服务器将主题中的 [$dn] 替换为 dc=subdomain1,dc=hostedCompany1。
得到的主题为 groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"。如果因为绑定 DN 是该组的成员而授予访问权限,则宏扩展将停止,并对此 ACI 进行评估。如果绑定 DN 不是其成员,则此过程将继续。
服务器将主题中的 [$dn] 替换为 dc=hostedCompany1。
得到的主题为 groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com"。再次将绑定 DN 作为此组的成员进行测试,如果是其成员,则对此 ACI 进行完全评估。如果此绑定 DN 不是其成员,宏扩展将在最后一个具有匹配值的 RDN 处停止,并且对此 ACI 的评估将结束。
[$dn] 宏的优点在于它提供了一种灵活的方法,可以为域级别管理员授予对目录树中所有子域的访问权限。因此,[$dn] 宏在表示域之间的层次关系方面非常有用。
例如,请考虑以下 ACI:
aci: (target="ldap:///ou=*,($dn),dc=example,dc=com") (targetattr="*") (targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn= "ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";) |
此 ACI 为 cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com 的成员授予对 dc=hostedCompany1 下所有子域的访问权限。因此,属于该组的管理员可以访问 ou=people,dc=subdomain1.1,dc=subdomain1 等子树。
但同时将拒绝 cn=DomainAdmins,ou=Groups, dc=subdomain1.1 的成员访问 ou=people,dc=subdomain1, dc=hostedCompany1 和 ou=people,dc=hostedCompany1 节点。
将始终在 DN 的主题部分使用 ($attr.attrname) 宏。例如,您可以定义以下 roledn:
roledn = "ldap:///cn=DomainAdmins,($attr.ou),dc=HostedCompany1,dc=example,dc=com" |
现在假定服务器收到了将以下条目作为目标的 LDAP 操作:
dn: cn=Babs Jensen,ou=People,dc=HostedCompany1,dc=example,dc=com cn: Babs Jensen sn: Jensen ou: Sales ... |
为了评估 ACI 的 roledn 部分,服务器会读取存储在目标条目中的 ou 属性值。然后,服务器将在主题中替换此值以扩展宏。在此示例中,roledn 将按如下方式扩展:
roledn = "ldap:///cn=DomainAdmins,ou=Sales,dc=HostedCompany1,dc=example,dc=com" |
然后目录服务器将根据普通 ACI 评估算法来评估此 ACI。
如果宏中指定的属性为多值属性,将依次使用每个值来扩展宏。将使用提供成功匹配的第一个值。