Để đả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ể xem 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 các mục đó từ kho lưu trữ của doanh nghiệp. Bạn phải lập mô hình 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 bộ phương thức ACL phong phú đủ mạnh để mô hình hoá ACL của hầu hết các kho lưu trữ.
Tạo ACL
Quy trình tạo ACL gồm hai bước:
- Tạo
Principal
bằng các phương thức tĩnh trong lớp ACL. - Sử dụng lớp
Acl.Builder
để tạo ACL bằng nguyên tắc.
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 mà bạn cần biết để lập mô hình và tạo ACL, chẳng hạn như kế thừa và chứa.
Tạo một chủ thể 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 phân giải đến đị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 thực thể 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
dùng để tạo đối tượng Principal
.
Tính kế thừa ACL
Tính năng 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 việc kế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ục.
Đặt tính kế thừa
Mỗi mục có thể có các nguyên tắc được phép trực tiếp và các nguyên tắc bị từ chối trực tiếp, được chỉ định bằng phương thức setReaders()
và setDeniedReaders()
. Một thực thể được 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ể. Nguyên tắc bị từ chối trực tiếp là một 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 nguyên tắc cho phép gián tiếp và các nguyên tắc từ chối gián tiếp bằng cách sử dụng phương thức setInheritFrom()
. Một nguyên tắc được phép gián tiếp là một người dùng, thông qua việc kế thừa ACL, có quyền truy cập gián tiếp vào một mục cụ thể. Một nguyên tắc bị từ chối gián tiếp là một 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 sử dụng phương thức setInheritFrom()
để kế thừa các nguyên tắc gián tiếp được phép và gián tiếp bị từ chối.
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à chủ sở hữu trực tiếp được phép của mục A.
- Người dùng 2 là một chủ sở hữu trực tiếp được phé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, quy tắc truy cập là:
- Người dùng 1 không cần được chỉ định rõ ràng là một nguyên tắc của mục B để là một nguyên tắc đượ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à một nguyên tắc đượ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.
- Người dùng 2 không phải là chủ sở hữu gián tiếp được phép đối với 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 phần tử con kết hợp với ACL của phần tử mẹ. Acl.InheritanceType
triển khai 3 loại kế thừa:
BOTH_PERMIT
– Đặt loại kế thừa thànhBOTH_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 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ànhCHILD_OVERRIDE
để buộc ACL của mục con phải được ưu tiên hơn ACL của mục mẹ kế thừa khi các ACL này xung đột. Vì vậy, nếu ACL của mục mẹ từ chối 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 họ 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 bị từ chối của mục con.PARENT_OVERRIDE
– Đặt loại kế thừa thànhPARENT_OVERRIDE
để buộc ACL của mục mẹ được ưu tiên hơn ACL của mục con khi các ACL đó xung đột. Vì vậy, nếu ACL của mục con từ chối 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 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 sẽ 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ừ lá đến 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 phần tử con với phần tử mẹ và có thể tiến đến phần tử mẹ gốc.
Ví dụ: nếu phần tử con có loại kế thừa CHILD_OVERRIDE
và người dùng có quyền truy cập vào phần tử con, thì Drive không cần đánh giá phần tử 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 trong 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ột 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/vùng chứa thiết lập hệ phân cấp thực 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 có trong vùng chứa đó cũng sẽ bị xoá.
Mối quan hệ chứa 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ể được chứa trong một thư mục để 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 ACL của thư mục đó, trừ phi các mục đó cũng nằm trong hệ 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à chủ sở hữu trực tiếp được phép của mục A.
- Người dùng 2 là một chủ sở hữu trực tiếp được phép của mục B.
- Người dùng 3 là chủ sở hữu trực tiếp được phép của mục C.
- Mục C kế thừa ACL của mục A.
- Mục B đặt tên 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 chế độ kiểm soát quyền truy cập, 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ừ 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.
Việc tách tính năng kế thừa ACL khỏ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 một mục được xoá thành công:
- Mọi mục chứa mục đã xoá sẽ không thể tìm kiếm được và sẽ được lên lịch xoá khỏi nguồn dữ liệu của Google.
- Mọi mục đã 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 đã xoá bằng phương thức setInheritFrom()
nhưng không có nhóm vùng chứa được đặt bằng setContainer()
hoặc hệ phân cấp vùng chứa không chứa mục đã xoá, thì mục đó và dữ liệu của mục đó vẫn còn 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 hoạt động của thao tác xoá đối với hệ phân cấp mục.
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à chủ sở hữu trực tiếp được phép của mục A.
- Người dùng 2 là chủ sở hữu trực tiếp được phé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 gốc vì không có mục vùng chứa.
Xoá theo kiểu thác nước thông qua các tệp đối chiếu vùng chứa. Khi mục A bị xoá:
- Tất cả phần tử con của tham chiếu
setInheritFrom()
sẽ mất quyền truy cập đối với tất cả người dùng. - Không có người dùng nào có thể truy cập vào mục A.
- Mục D bị xoá ngầm. Không có 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ỉ diễn ra theo kiểu thác nước thông qua các tham chiếu vùng chứa.
- Mục E không thể truy cập được và không có người dùng nào có thể tìm kiếm mục E.