為了簡化本節中的討論,用於提供連結憑證的 ACI 關鍵字 (例如 userdn、roledn、groupdn 和 userattr) 總稱為 ACI 的主體。主體可決定套用 ACI 的對象。
下表說明可取代特定 ACI 關鍵字的巨集。
表 6–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 的 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 節點。
($attr.attrname) 巨集一律用於 DN 的主體部分中。例如,您可以定義下列 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 的評估。
若巨集中的已命名屬性為多值屬性,則會依序使用每個值展開巨集。會採用第一個產生成功比對的值。