Á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ể 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 truy cập (ACL) của mục đó trong kho lưu trữ của doanh nghiệp. Bạn phải mô hình hoá 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ữ. Content Connector SDK cung cấp một tập hợp phong phú các phương thức ACL đủ mạnh để mô hình hoá ACL của hầu hết các kho lưu trữ.

Tạo một ACL

Tạo ACL là một quy trình gồm 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 thực thể 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 để mô hình hoá và tạo ACL, chẳng hạn như tính kế thừa và tính bao hàm.

Tạo một thực thể 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ân giải thành đị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, Content Connector SDK 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 đố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 các đối tượng Principal.

Tính kế thừa ACL

Quyền kế thừa ACL đề cập đến quyền 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 ACL của mục đó và ACL của chuỗi kế thừa. Các quy tắc đượ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ục.

Đặt chế độ kế thừa

Mỗi mục có thể có các thực thể chính được cho phép trực tiếpcác thực thể chính bị từ chối trực tiếp, được chỉ định bằng các phương thức setReaders()setDeniedReaders(). Nguyên tắc được cho phép trực tiếp là một người dùng được xác định trong ACL, cho phép họ truy cập trực tiếp vào một mục cụ thể. Một người dùng 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 thực thể gián tiếp được phépcác thực thể gián tiếp bị từ chối bằng phương thức setInheritFrom(). Một người dùng gián tiếp được phé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 việc kế thừa ACL. Bên được 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 tính năng kế thừa ACL.

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

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

Các chế độ 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à một đối tượng chính được cho phép trực tiếp của mục A.
  • Người dùng 2 là một đối tượng đượ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 chế độ kiểm soát quyền truy cập, các quy tắc truy cập là:

  • Bạn không cần chỉ định rõ ràng Người dùng 1 làm đối tượng chính của mục B để trở thành đối tượng chính được cho 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 cho phép trực tiếp của mục A và mục B kế thừa ACL của mục A.
  • Người dùng 2 không phải là một người dùng gián tiếp được phép truy cập vào 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 một đối tượng kết hợp với ACL của đối tượng mẹ. Acl.InheritanceType triển khai 3 loại 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ả ACL của mục con và ACL của mục đượ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 mẹ được kế thừa khi chúng xung đột. Vì vậy, nếu ACL của mục mẹ từ chối 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 con với tư cách là người đọ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, thì người dùng vẫn không có quyền truy cập nếu họ là người đọc bị từ chối của mục con.

  • PARENT_OVERRIDE – Đặt loại kế thừa thành PARENT_OVERRIDE để buộc ACL của mục mẹ được ưu tiên hơn 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 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à người đọ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 bị từ chối của mục mẹ.

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ừ nút lá đến nút gốc cho các 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á một thành phần con với các thành phần mẹ của nó và có thể tiến đến thành phần mẹ gốc.

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

Ngăn chặn và xoá 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ệ giữa vùng chứa và đối tượng được chứa thiết lập hệ thống 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 một vùng chứa bị xoá, các mục trong vùng chứa đó cũng sẽ bị xoá.

Mối quan hệ ngăn chặn 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. Việc xoá một thư mục không xoá các mục kế thừa ACL của thư mục đó, trừ phi các mục đó cũng nằm trong hệ thống phân cấp chứa của thư mục.

Các chế độ 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à một đối tượng chính được cho phép trực tiếp của mục A.
  • Người dùng 2 là một đối tượng được phép trực tiếp của mục B.
  • Người dùng 3 là một đối tượng chính được cho phép trực tiếp của mục C.
  • Mục C kế thừa ACL của mục A.
  • Mặt hàng B đặt tên cho mặt hàng A là vùng chứa của mặt hàng B.
  • Mặt hàng C đặt tên cho mặt hàng 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 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 ACL của mục A.
  • Quyền truy cập gián tiếp không đến từ việc 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.
Vẽ các mối 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 tách tính năng kế thừa ACL khỏi hệ thống phân cấp ngăn chặn cho phép bạn mô hình hoá nhiều cấu trúc hiện có khác nhau.

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

  • Mọi mục chứa một mục đã bị 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.
  • Mọi mục đã chỉ định mục bị xoá bằng phương thức setInheritFrom() đều 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ó một vùng chứa được đặt bằng setContainer(), hoặc hệ thống phân cấp vùng chứa của tài nguyên đó không chứa mục nào đã bị xoá, thì mục đó và dữ liệu của mục đó vẫn nằm trong nguồn dữ liệu của Google. Bạn chịu trách nhiệm xoá mặt hàng.

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

Vẽ các mối kết nối giữa các mục
Hình 3. Xoá một mục và quyền truy cập kế thừa.

Các chế độ 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à một đối tượng chính được cho phép trực tiếp của mục A.
  • Người dùng 2 là một thực thể đượ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 cho mục A là vùng chứa của mục đó.
  • Mặt hàng A và E là mặt hàng cấp gốc vì không có mặt hàng chứa.

Các thao tác xoá sẽ được thực hiện theo tầng thông qua các tệp đối 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() đều mất quyền truy cập đối với tất cả 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 sẽ bị xoá ngầm. Không người dùng nào có thể truy cập vào mục D.
  • Mục E không bị xoá, vì thao tác xoá chỉ được thực hiện thông qua các tham chiếu đến vùng chứa.
  • Mục E không thể truy cập và không người dùng nào có thể tìm kiếm mục E.