Để đả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, hãy lập chỉ mục các mục bằng danh sách kiểm soát truy cập (ACL) của chúng 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 chúng vào khi lập chỉ mục các mục. Content Connector SDK cung cấp các phương thức để mô hình hoá ACL của hầu hết các kho lưu trữ.
Tạo ACL
Tạo ACL là một quy trình gồm hai bước:
- Tạo
Principalbằ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 thực thể chính.
Tài liệu này đề cập đến các khái niệm để mô hình hoá và tạo ACL, chẳng hạn như tính kế thừa và tính ngăn chặn.
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 mã nhận dạng bên ngoài (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 getGroupPrincipal để tạo các đối tượng chính chứa mã nhận dạng bên ngoài. Lớp ACL bao gồm một số phương thức tĩnh khác để tạo các đối tượng Principal.
Sau khi ánh xạ lại danh tính của một mục, bạn phải lập chỉ mục lại các mục để danh tính mới có hiệu lực. Để biết thêm thông tin, hãy tham khảo bài viết Liên kết lại các thông tin nhận dạng.
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 và người dùng cụ thể dựa trên ACL kết hợp của mục đó và chuỗi kế thừa của mục đó. Các quy tắc cho 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ể được phép trực tiếp và các thực thể bị từ chối trực tiếp, được chỉ định bằng các phương thức setReaders và 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 có quyền truy cập trực tiếp vào một mục. Bên được 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.
Một mục cũng có thể kế thừa các thực thể gián tiếp được phép và cá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 được cho phép gián tiếp có quyền truy cập gián tiếp vào một mục thông qua tính năng kế thừa ACL. Đối tượng chính bị từ chối gián tiếp sẽ bị từ chối quyền truy cập thông qua tính năng kế thừa.
Hình 1 cho thấy cách sử dụng phương thức setInheritFrom để kế thừa các thực thể chính.
setInheritFrom.Hình 1 minh hoạ các chế độ kiểm soát quyền truy cập này:
- Người dùng 1 là một thực thể được 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 B.
- Mục B kế thừa ACL của mục A.
Dựa trên các chế độ kiểm soát này, các quy tắc truy cập là:
- Người dùng 1 là một thực thể gián tiếp được phép của mục B mà không được chỉ định rõ ràng; quyền truy cập được kế thừa từ 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 của 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 con kết hợp với ACL mẹ. Acl.InheritanceType triển khai 3 loại:
BOTH_PERMIT– Chỉ cấp quyền truy cập khi cả ACL của trẻ và cha mẹ đều cho phép.CHILD_OVERRIDE– Danh sách kiểm soát truy cập (ACL) của trẻ em được ưu tiên hơn danh sách kiểm soát truy cập của cha mẹ trong trường hợp có xung đột. Người dùng có thể truy cập vào trẻ ngay cả khi cha mẹ từ chối hoặc bị từ chối quyền truy cập vào trẻ ngay cả khi cha mẹ cho phép.PARENT_OVERRIDE– ACL của cấp trên được ưu tiên hơn ACL của cấp dưới trong trường hợp có xung đột.
Cloud Search đánh giá chuỗi kế thừa ACL từ lá đến gốc. Quy trình đánh giá bắt đầu từ trẻ và cha mẹ của trẻ, sau đó có thể chuyển sang cha mẹ gốc.
Ví dụ: nếu trẻ sử dụng CHILD_OVERRIDE và người dùng có quyền truy cập, thì Cloud Search không cần đánh giá cha mẹ. Tuy nhiên, nếu phần tử con sử dụng PARENT_OVERRIDE hoặc BOTH_PERMIT, thì Cloud Search sẽ tiếp tục đánh giá chuỗi này.
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ục đó là một vùng chứa bằng phương thức setContainer của lớp IndexingItemBuilder. Mối quan hệ này thiết lập hệ thống phân cấp thực tế và đảm bảo việc xoá đúng cách. Khi bạn xoá một vùng chứa, các mục trong vùng chứa đó cũng sẽ bị xoá.
Mối quan hệ ngăn chặn độc lập với các quy tắc kế thừa ACL. Ví dụ: một thư mục có thể chứa một tệp để xoá, nhưng tệp đó có thể 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ệ thống phân cấp chứa thư mục đó.
Hình 2 minh hoạ các chế độ kiểm soát quyền truy cập này:
- Người dùng 1 là một thực thể được 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 B.
- Người dùng 3 là một thực thể đượ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ục C đặt tên cho mục B làm vùng chứa của mục đó.
Dựa trên các chế độ kiểm soát này, 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. Người dùng 1 có thể truy cập vào mục C vì mục này kế thừa từ mục A. - Quyền truy cập gián tiếp không đến từ việc chứa đựng. Người dùng 2 không thể truy cập vào mục C.
setInheritFrom đang được sử dụng.Việc tách biệt tính kế thừa ACL khỏi tính năng ngăn chặn cho phép bạn mô hình hoá nhiều cấu trúc.
Khi bạn xoá một mục:
- Mọi mục chứa mục đã xoá đều không thể tìm kiếm được và được lên lịch để xoá.
- Mọi mục chỉ định mục đã xoá trong
setInheritFromđều không thể tìm kiếm được.
Nếu một tài nguyên sử dụng setInheritFrom cho một mục đã bị xoá nhưng không có bộ chứa nào được đặt hoặc hệ thống phân cấp của tài nguyên đó không chứa mục nào bị xoá, thì mục đó vẫn nằm trong nguồn dữ liệu.
Bạn có trách nhiệm xoá nội dung đó.
Hình 3 minh hoạ ví dụ về việc xoá một hệ phân cấp mục.
Hình 3 minh hoạ các chế độ kiểm soát quyền truy cập này:
- Người dùng 1 là một thực thể được 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à E đều kế thừa từ 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.
Các thao tác xoá sẽ được thực hiện theo tầng thông qua các tham chiếu vùng chứa. Khi bạn xoá mục A:
- Tất cả các tài khoản con của tài khoản
setInheritFromđều mất quyền truy cập. - Người dùng không còn truy cập được vào mục A nữa.
- Mục D sẽ bị xoá ngầm và không thể truy cập được.
- Mục E không bị xoá mà trở nên không thể truy cập và không thể tìm kiếm.