為確保只有有權存取項目的使用者才能在搜尋結果中看到該項目,請從企業存放區為項目建立索引,並附上存取控制清單 (ACL)。您必須建立存放區 ACL 模型,並在為項目建立索引時納入這些 ACL。Content Connector SDK 提供的方法可為大多數存放區的 ACL 建立模型。
建立 ACL
建立 ACL 的程序分為兩個步驟:
- 使用 ACL 類別中的靜態方法建立
Principal。 - 使用
Acl.Builder類別,透過主體建構 ACL。
本文涵蓋建立 ACL 的概念,例如繼承和包含。
使用外部 ID 建立主體
Google Cloud Search 必須將使用者和群組解析為 Google 電子郵件地址。建立存放區項目的索引時,內容連接器可能沒有這些電子郵件地址。不過,Content Connector SDK 可讓您使用外部 ID (授予使用者或群組資源庫項目存取權的 ID),而非電子郵件地址來為項目建立索引。使用 getUserPrincipal 方法或 getGroupPrincipal 方法建立含有外部 ID 的主體。ACL 類別包含其他幾種靜態方法,可用於建構 Principal 物件。
重新對應項目的 ID 後,必須重新為項目建立索引,新的 ID 才會生效。詳情請參閱「重新對應身分」。
ACL 繼承
ACL 繼承是指根據項目及其繼承鏈的合併 ACL,授權特定項目和使用者。授權決策的規則取決於存放區和項目屬性。
設定繼承
每個項目都可以有直接允許的主體和直接拒絕的主體,使用 setReaders 和 setDeniedReaders 方法指定。直接允許的主體是指 ACL 中識別的使用者,可直接存取項目。直接遭拒的主體是指 ACL 中識別為「無法存取項目」的使用者。
項目也可以使用 setInheritFrom 方法,繼承間接允許的主體和間接拒絕的主體。間接允許的主體可透過 ACL 繼承間接存取項目。間接遭拒主體是透過繼承遭拒存取。
圖 1 顯示如何使用 setInheritFrom 方法來繼承主體。

setInheritFrom 方法。圖 1 說明這些存取控制項:
- 使用者 1 是項目 A 的直接允許主體。
- 使用者 2 是項目 B 的直接允許主體。
- 項目 B 會沿用項目 A 的 ACL。
根據這些控制項,存取規則如下:
- 使用者 1 是項目 B 的間接允許主體,不必明確指定;存取權是從項目 A 繼承而來。
- 使用者 2 不是項目 A 的間接允許主體。
設定繼承類型
如果您使用 setInheritFrom 方法設定繼承,則必須使用 setInheritanceType 方法設定繼承類型。繼承類型會決定子項 ACL 與父項 ACL 的合併方式。Acl.InheritanceType
實作三種類型:
BOTH_PERMIT- 只有在子項和父項 ACL 都允許的情況下,才授予存取權。CHILD_OVERRIDE- 如有衝突,子項 ACL 的優先順序高於父項 ACL。即使家長拒絕,使用者仍可存取孩子帳戶;即使家長允許,使用者也可能無法存取孩子帳戶。PARENT_OVERRIDE- 如有衝突,父項 ACL 的優先順序高於子項 ACL。
Cloud Search 會評估從葉節點到根節點的 ACL 繼承鏈。評估作業會從子項及其父項開始,並可逐步進行至根父項。
舉例來說,如果孩子使用 CHILD_OVERRIDE,且使用者有存取權,Cloud Search 就不需要評估上層。不過,如果孩子使用 PARENT_OVERRIDE 或 BOTH_PERMIT,Cloud Search 會繼續評估鏈結。
防堵與刪除項目
為項目建立索引時,可以使用 IndexingItemBuilder 類別的 setContainer 方法,將項目標示為容器。這項關係會建立實體階層,並確保正確刪除。刪除容器時,系統也會刪除其中的項目。
包含關係與 ACL 繼承規則無關。舉例來說,資料夾可能包含要刪除的檔案,但該檔案可從其他資料夾繼承 ACL。刪除資料夾不會刪除繼承 ACL 的項目,除非這些項目也位於資料夾的包含階層中。
圖 2 顯示這些存取權控管:
- 使用者 1 是項目 A 的直接允許主體。
- 使用者 2 是項目 B 的直接允許主體。
- 使用者 3 是項目 C 的直接允許主體。
- 項目 C 會沿用項目 A 的 ACL。
- 項目 B 將項目 A 命名為容器。
- 項目 C 將項目 B 命名為容器。
根據這些控制項,存取規則如下:
- 間接存取來自
setInheritFrom方法。使用者 1 可以存取項目 C,因為項目 C 繼承自項目 A。 - 間接存取權並非來自於包含項目。使用者 2 無法存取項目 C。
setInheritFrom
方法。將 ACL 繼承與包含項目分開,可讓您建立許多結構的模型。
刪除項目後:
- 含有已刪除項目的任何項目都會無法搜尋,並排定刪除時間。
- 凡是指定已刪除項目的項目都會變成無法搜尋。
setInheritFrom
如果資源使用 setInheritFrom 處理已刪除的項目,但沒有設定容器,或階層中沒有已刪除的項目,該項目仍會保留在資料來源中。您必須負責刪除。
圖 3 顯示項目階層的刪除範例。

圖 3 說明這些存取權控管:
- 使用者 1 是項目 A 的直接允許主體。
- 使用者 2 是項目 D 的直接允許主體。
- 項目 D 和 E 都繼承自項目 A。
- 項目 D 將項目 A 命名為容器。
- 項目 A 和 E 是根層級項目。
刪除作業會透過容器參照層疊。刪除項目 A 後:
- 所有
setInheritFrom參考檔案的子系都會失去存取權。 - 使用者無法再存取項目 A。
- 項目 D 會隱含刪除,且無法存取。
- 項目 E 不會遭到刪除,但會變成無法存取和搜尋。