Ánh xạ ACL

Để đảm bảo rằng chỉ người dùng có quyền truy cập vào một mục mới có thể nhìn thấy mục đó trong kết quả tìm kiếm, bạn nên lập chỉ mục các mục bằng danh sách kiểm soát quyền truy cập (ACL) của mục đó từ kho lưu trữ của doanh nghiệp. Bạn phải lập mô hình các ACL của kho lưu trữ và đưa các ACL đó vào khi lập chỉ mục các mục trong kho lưu trữ. SDK trình kết nối nội dung cung cấp một tập hợp phong phú các phương thức ACL, đủ mạnh để lập mô hình các ACL của hầu hết kho lưu trữ.

Tạo ACL

Tạo ACL là quy trình hai bước:

  1. Tạo một Principal bằng các phương thức tĩnh trong lớp ACL.
  2. Sử dụng lớp Acl.Builder để tạo ACL bằng cách sử dụng lớp chính.

Phần còn lại của tài liệu này trình bày một số khái niệm bạn cần biết để lập mô hình và tạo các ACL, chẳng hạn như tính kế thừa và vùng chứa.

Tạo tài khoản chính bằng mã bên ngoài

Google Cloud Search yêu cầu người dùng và nhóm phải chuyển sang địa chỉ email của Google. Khi lập chỉ mục các mục trong kho lưu trữ, trình kết nối nội dung có thể không có những địa chỉ email này. Tuy nhiên, SDK Trình kết nối nội dung cho phép bạn sử dụng mọi mã nhận dạng bên ngoài (ID cấp cho người dùng hoặc nhóm quyền truy cập vào các mục trong kho lưu trữ), thay vì địa chỉ email, để lập chỉ mục một mục. Sử dụng phương thức getUserPrincipal() hoặc phương thức getGroupPrincpal() để tạo các đối tượng chính chứa mã nhận dạng bên ngoài. Có một số phương thức tĩnh khác trong lớp ACL được dùng để tạo đối tượng Principal.

Kế thừa danh sách kiểm soát quyền truy cập (ACL)

Tính kế thừa ACL đề cập đến việc uỷ quyền, cho một mục cụ thể và một người dùng cụ thể, dựa trên kết quả của tổ hợp các ACL của mục và các ACL của chuỗi kế thừa. Các quy tắc dùng để đưa ra quyết định uỷ quyền phụ thuộc vào kho lưu trữ và thuộc tính của mặt hàng.

Đặt tính kế thừa

Mỗi mục có thể có các đối tượng chính được phép trực tiếpcác đối tượng chính bị từ chối trực tiếp, được chỉ định bằng các phương thức setReaders()setDeniedReaders(). Người dùng chính được phép trực tiếp là người dùng được xác định trong một Danh sách kiểm soát quyền truy cập (ACL) cho phép họ truy cập trực tiếp vào một mục cụ thể. Đối tượng chính bị từ chối trực tiếp là người dùng được xác định trong ACL là không có quyền truy cập vào một mục cụ thể.

Một mục cũng có thể kế thừa các đối tượng chính được phép gián tiếpcác đối tượng chính bị từ chối gián tiếp bằng phương thức setInheritFrom(). Người dùng chính được phép gián tiếp là người dùng có quyền truy cập gián tiếp vào một mục cụ thể thông qua cơ chế kế thừa Danh sách kiểm soát quyền truy cập (ACL). Đối tượng chính bị từ chối gián tiếp là người dùng bị từ chối quyền truy cập vào một mục cụ thể thông qua cơ chế kế thừa Danh sách kiểm soát quyền truy cập (ACL).

Hình 1 cho thấy cách dùng phương thức setInheritFrom() để kế thừa các đối tượng chính được cho phép gián tiếp và bị từ chối gián tiếp.

Bản vẽ mối liên kết giữa các thành phần
Hình 1. Phương thức setInheritFrom().

Các kiểm soát truy cập này được thể hiện trong Hình 1:

  • Người dùng 1 là đối tượng chính được phép trực tiếp của mục A.
  • Người dùng 2 là đối tượng chính được phép trực tiếp của mục B.
  • Mục B kế thừa ACL của mục A.

Dựa trên các biện pháp kiểm soát quyền truy cập, các quy tắc truy cập là:

  • Người dùng 1 không cần được chỉ định rõ ràng là đối tượng chính của mục B để trở thành đối tượng chính được phép gián tiếp của mục B; quyền truy cập được kế thừa vì Người dùng 1 được liệt kê là đối tượng chính được phép trực tiếp của mục A và mục B kế thừa Danh sách kiểm soát quyền truy cập (ACL) từ mục A.
  • Người dùng 2 không phải là đối tượng được phép gián tiếp cho mục A.

Đặt loại kế thừa

Nếu đặt tính kế thừa bằng phương thức setInheritFrom(), bạn phải đặt loại kế thừa bằng phương thức setInheritanceType(). Loại kế thừa xác định cách ACL của trẻ kết hợp với ACL của nhà xuất bản mẹ. Acl.InheritanceType triển khai 3 kiểu kế thừa:

  • BOTH_PERMIT – Đặt loại kế thừa thành BOTH_PERMIT để cấp cho người dùng quyền truy cập vào mục chỉ khi cả Danh sách kiểm soát quyền truy cập (ACL) của mục con và Danh sách kiểm soát quyền truy cập (ACL) của mục kế thừa của mục mẹ đều cho phép người dùng truy cập vào mục đó.

  • CHILD_OVERRIDE – Đặt loại kế thừa thành CHILD_OVERRIDE để buộc ACL của mục con được ưu tiên hơn ACL của mục gốc kế thừa khi chúng xung đột. Vì vậy, nếu Danh sách kiểm soát quyền truy cập (ACL) của mục mẹ từ chối cấp quyền truy cập cho người dùng với tư cách là người đọc bị từ chối, thì người dùng vẫn có quyền truy cập nếu có quyền truy cập vào mục con với tư cách là trình đọc. Ngược lại, ngay cả khi ACL của mục mẹ cấp quyền truy cập cho người dùng, người dùng vẫn không có quyền truy cập nếu họ là người đọc mục con bị từ chối.

  • PARENT_OVERRIDE – Đặt loại kế thừa thành PARENT_OVERRIDE để buộc ACL của mục gốc ưu tiên hơn ACL của mục con khi chúng xung đột. Vì vậy, nếu Danh sách kiểm soát quyền truy cập (ACL) của mục con từ chối cấp quyền truy cập cho người dùng với tư cách là trình đọc bị từ chối, thì người dùng vẫn có quyền truy cập nếu có quyền truy cập vào mục mẹ với tư cách là trình đọc. Ngược lại, ngay cả khi ACL của mục con cấp quyền truy cập cho người dùng, thì người dùng vẫn không có quyền truy cập nếu họ là người đọc mục mẹ bị từ chối.

Khi đánh giá chuỗi kế thừa ACL, thứ tự đánh giá có thể thay đổi kết quả của quyết định uỷ quyền. Cloud Search cung cấp thứ tự đánh giá từ lá đến gốc cho chuỗi kế thừa ACL. Cụ thể, quyết định ACL cho một chuỗi bắt đầu bằng việc đánh giá trẻ với thư mục mẹ và có thể tiến hành đến thư mục gốc gốc.

Ví dụ: nếu thành phần con có loại kế thừa CHILD_OVERRIDE và người dùng có quyền truy cập vào thành phần con, thì Drive không cần đánh giá thành phần mẹ. Tuy nhiên, nếu thành phần con có PARENT_OVERRIDE hoặc BOTH_PERMIT, thì Drive sẽ tiếp tục đánh giá tính kế thừa ở cấp cao hơn trong chuỗi.

Xoá vùng chứa và mục

Khi lập chỉ mục một mục, bạn có thể gắn nhãn một mục là vùng chứa bằng phương thức setContainer() của lớp IndexingItemBuilder. Mối quan hệ vùng chứa/thành phần chứa thiết lập hệ phân cấp vật lý của các mục và đảm bảo các mục được xoá đúng cách. Khi vùng chứa bị xoá, các mục chứa trong đó cũng bị xoá.

Mối quan hệ lưu trữ hoàn toàn độc lập với các quy tắc kế thừa ACL. Ví dụ: một tệp trong hệ thống tệp có thể nằm trong một thư mục nhằm mục đích xoá, nhưng kế thừa ACL từ một thư mục khác. Thao tác xoá một thư mục sẽ không xoá các mục kế thừa ACL, trừ phi các mục đó cũng nằm trong hệ phân cấp vùng chứa của thư mục đó.

Các kiểm soát truy cập này được thể hiện trong Hình 2:

  • Người dùng 1 là đối tượng chính được phép trực tiếp của mục A.
  • Người dùng 2 là đối tượng chính được phép trực tiếp của mục B.
  • Người dùng 3 là đối tượng chính được phép trực tiếp của mục C.
  • Mục C kế thừa ACL của mục A.
  • Mục B đặt tên cho mục A làm vùng chứa.
  • Mục C đặt tên mục B làm vùng chứa.

Dựa trên các biện pháp kiểm soát quyền truy cập, các quy tắc truy cập là:

  • Quyền truy cập gián tiếp đến từ phương thức setInheritFrom(). Do đó, người dùng 1 có thể truy cập vào mục C vì mục C kế thừa Danh sách kiểm soát quyền truy cập (ACL) của mục A.
  • Quyền truy cập gián tiếp không đến từ mục C thuộc mục B. Do đó, người dùng 2 không thể truy cập vào mục C.
Bản vẽ mối liên kết giữa các thành phần
Hình 2. Phương thức setInheritFrom() đang được sử dụng.

Việc tách riêng tính kế thừa ACL với hệ phân cấp vùng chứa cho phép bạn lập mô hình nhiều cấu trúc hiện có.

Khi xoá một mục thành công:

  • Mọi mục chứa một mục đã xoá sẽ không thể tìm kiếm được và được lên lịch xoá khỏi nguồn dữ liệu của Google.
  • Bất kỳ mục nào đã chỉ định mục bị xoá bằng phương thức setInheritFrom() sẽ trở thành không thể tìm kiếm được.

Nếu một tài nguyên có một mục đã bị xoá bằng phương thức setInheritFrom(), nhưng tài nguyên đó không có tập hợp vùng chứa bằng setContainer() hoặc hệ phân cấp vùng chứa không chứa các mục đã xoá, thì mục đó và dữ liệu của mục đó sẽ vẫn còn trong nguồn dữ liệu của Google. Bạn có trách nhiệm xoá mục này.

Hình 3 đưa ra ví dụ về cách hoạt động của quy trình xoá đối với hệ phân cấp mục.

Bản vẽ mối liên kết giữa các thành phần
Hình 3. Xoá một mục và tính kế thừa Danh sách kiểm soát quyền truy cập (ACL).

Các kiểm soát quyền truy cập này được thể hiện trong Hình 3:

  • Người dùng 1 là đối tượng chính được phép trực tiếp của mục A.
  • Người dùng 2 là đối tượng chính được phép trực tiếp của mục D.
  • Mục D và mục E đều kế thừa ACL của mục A.
  • Mục D đặt tên mục A làm vùng chứa.
  • Mục A và E là các mục cấp cơ sở vì chúng không có mục vùng chứa.

Xoá phân tầng qua các tham chiếu vùng chứa. Khi mục A bị xoá:

  • Mọi phần tử con của tệp đối chiếu setInheritFrom() đều mất quyền truy cập đối với mọi người dùng.
  • Không người dùng nào có thể truy cập vào mục A.
  • Mục D hoàn toàn bị xoá. Không người dùng nào có thể truy cập mục D.
  • Mục E không bị xoá vì hoạt động xoá chỉ chuyển qua các tham chiếu vùng chứa.
  • Không truy cập được mặt hàng E và không người dùng nào có thể tìm kiếm mặt hàng E.