Ánh xạ ACL

Để đảm bảo rằng chỉ những người dùng có quyền truy cập vào một mục mới có thể 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) từ kho lưu trữ dành cho doanh nghiệp. Bạn phải mô hình hoá các ACL của kho lưu trữ và bao gồm các ACL đó 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 bộ phương thức ACL phong phú đủ mạnh để lập mô hình các ACL của hầu hết kho lưu trữ.

Tạo Danh sách kiểm soát quyền truy cập (ACL)

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

  1. Tạo 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 đề cập đến một số khái niệm 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 đối tượng chính bằng mã nhận dạng 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ó các đị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 bất kỳ mã nhận dạng bên ngoài nào (mã nhận dạng 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 hiệu ứ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 các đối tượng Principal.

Kế thừa ACL

Kế thừa ACL là hoạt động 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 sự kết hợp giữa các ACL của mục và các ACL của chuỗi kế thừa của mục đó. 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à các thuộc tính của mặt hàng.

Đặt kế thừa

Mỗi mục có thể có các thành phần chính được phép trực tiếpcác thành phần 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à một người dùng được xác định trong một Danh sách kiểm soát quyền truy cập (ACL) cấp cho họ quyền truy cập trực tiếp vào một mục cụ thể. Người dùng chính bị từ chối trực tiếp là người dùng được xác định trong Danh sách kiểm soát quyền truy cập (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 gốc được phép gián tiếpcác đối tượng gốc bị từ chối gián tiếp bằng phương thức setInheritFrom(). Đối tượng chính được phép gián tiếp là một 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 ACL. Người dùng chính bị từ chối gián tiếp là một người dùng bị từ chối truy cập vào một mục cụ thể, thông qua quá trình kế thừa 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 phép gián tiếp và đối tượng chính bị từ chối gián tiếp.

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

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

  • Người dùng 1 là người dùng chính được phép trực tiếp của mục A.
  • Người dùng 2 là người dùng chính được phép trực tiếp của mục B.
  • Mục B kế thừa Danh sách kiểm soát quyền truy cập (ACL) của mục A.

Dựa trên các chế độ kiểm soát quyền truy cập, các quy tắc truy cập sẽ bao gồm:

  • 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 để là đối tượng chính được phép gián tiếp của mục B; quyền truy cập này đượ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 ACL của mục A từ mục A.
  • Người dùng 2 không phải là người dùng chính đượ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 con kết hợp với ACL của nhà xuất bản mẹ. Acl.InheritanceType triển khai 3 loại kế thừa:

  • BOTH_PERMIT – Đặt loại kế thừa thành BOTH_PERMIT để chỉ cấp cho người dùng quyền truy cập vào mục khi cả ACL của mục con và ACL mục kế thừa của mục gốc đề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 danh sách kiểm soát quyền truy cập (ACL) của mục con được ưu tiên so với ACL của mục gốc kế thừa khi chúng xung đột. Vì vậy, nếu 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 họ có quyền truy cập vào mục con với tư cách là người đọc. Ngược lại, ngay cả khi ACL của mục gốc 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 được ưu tiên so với ACL của mục con khi chúng xung đột. Vì vậy, nếu ACL của mục con từ chối cấp quyền truy cập của 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 họ 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, 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á một 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ừ gốc đế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á phần tử con có phần tử mẹ và có thể tiến triển theo mọi hướng đến phần tử mẹ 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á loại mẹ. Tuy nhiên, nếu phần tử con có PARENT_OVERRIDE hoặc BOTH_PERMIT, thì Drive sẽ tiếp tục đánh giá tính kế thừa ở phần trên của chuỗi.

Vùng chứa và xoá vật phẩm

Khi lập chỉ mục một mục, bạn có thể gắn nhãn mục đó là vùng chứa bằng cách sử dụng phương thức setContainer() của lớp IndexingItemBuilder. Mối quan hệ vùng chứa/đơn vị quản lý thiết lập hệ phân cấp thực tế 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ị xóa, các mục được chứa cũng sẽ bị xóa.

Các mối quan hệ vùng chứa hoàn toàn độc lập với các quy tắc kế thừa của Danh sách kiểm soát quyền truy cập (ACL). Ví dụ: một tệp trong hệ thống tệp có thể được chứa 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. Việc xoá một thư mục sẽ không xoá các mục kế thừa Danh sách kiểm soát quyền truy cập (ACL) của thư mục đó, 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 biện pháp kiểm soát quyền truy cập này được thể hiện trong Hình 2:

  • Người dùng 1 là người dùng chính được phép trực tiếp của mục A.
  • Người dùng 2 là người dùng chính được phép trực tiếp của mục B.
  • Người dùng 3 là người dùng chính được phép trực tiếp của mục C.
  • Mục C kế thừa Danh sách kiểm soát quyền truy cập (ACL) của mục A.
  • Mục B đặt tên mục A làm vùng chứa của mục.
  • Mục C đặt tên mục B làm vùng chứa.

Dựa trên các chế độ kiểm soát quyền truy cập, các quy tắc truy cập sẽ bao gồm:

  • 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 nằm trong mục B. Do đó, người dùng 2 không thể truy cập vào mục C.
Bản vẽ kết nối giữa các mục
Hình 2. Phương thức setInheritFrom() đang được sử dụng.

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

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

  • Bất kỳ mục nào chứa 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 đã xoá bằng phương thức setInheritFrom() sẽ 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 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 mục nào đã bị xoá, thì mục đó và dữ liệu tương ứng vẫn nằm trong nguồn dữ liệu của Google. Bạn có trách nhiệm xoá mục đó.

Hình 3 cho thấy một ví dụ về cách xoá dữ liệu đối với một hệ phân cấp mục.

Bản vẽ kết nối giữa các mục
Hình 3. Xoá một mục và kế thừa ACL.

Các biện pháp 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à người dùng chính được phép trực tiếp của mục A.
  • Người dùng 2 là người dù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 Danh sách kiểm soát quyền truy cập (ACL) của mục A.
  • Mục D đặt tên mục A làm vùng chứa của mục đó.
  • Mục A và E là các mục cấp gốc vì không có mục vùng chứa.

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

  • Tất cả các thành phần con của tham chiếu setInheritFrom() sẽ mất quyền truy cập của mọi người dùng.
  • Không người dùng nào có thể truy cập mục A.
  • Mục D sẽ bị xoá hoàn toàn. Không người dùng nào có thể truy cập mục D.
  • Mục E không bị xoá vì thao tác xoá chỉ xếp tầng thông qua các tham chiếu vùng chứa.
  • Không thể kết nối với mục E và không người dùng nào có thể tìm kiếm mục E.