Mặc dù các thao tác trong pipeline cung cấp một bộ tính năng phong phú, nhưng Rules engine chỉ được phép nhận dạng các bộ lọc so sánh (ví dụ: >) và logic (ví dụ: or) để đảm bảo khả năng thoả mãn ràng buộc và tính bảo mật.
Biểu thức bộ lọc được hỗ trợ
Để các thao tác trong Pipeline bị giới hạn trong phạm vi do các quy tắc của bạn đặt ra, thao tác đó phải sử dụng các toán tử logic và toán tử so sánh với các hằng số. Công cụ Quy tắc nhận dạng các loại bộ lọc sau:
- Thông tin so sánh:
eq,neq,gt,gte,lt,lte,in,arrayContains. - Logic:
and,or.
Dưới đây là một số ví dụ:
where(eq("foo", 2))where(lt("foo", 2))documents("/user/1", "/user/2").where(...)
Thuộc tính yêu cầu
Bạn có thể tiếp tục sử dụng đối tượng request để xác thực và truy vấn bối cảnh, mặc dù một số thuộc tính có trong các truy vấn tiêu chuẩn không được hỗ trợ trong các thao tác Pipeline.
Các thuộc tính được hỗ trợ
Công cụ mới vẫn hỗ trợ các thuộc tính sau:
request.auth: Truy cập vào dữ liệu mã thông báo và uid của người dùng.request.method: Xác định thao tác (Ví dụ:get,list).request.path: Đường dẫn của tài nguyên đang được truy cập.request.time: Dấu thời gian phía máy chủ của yêu cầu.
Thuộc tính không được hỗ trợ
Các thuộc tính request.query như limit, offset và orderBy không được hỗ trợ cho các quy tắc kiểm tra hoạt động của Pipeline do độ phức tạp của việc xác định các giá trị này trong các truy vấn nhiều giai đoạn.
Xử lý giai đoạn của quy trình và các quyền
Có nhiều giai đoạn trong quy trình tương ứng với các thao tác chi tiết cụ thể trong quy tắc bảo mật:
- Quyền
allow list: Được kích hoạt bởi các giai đoạncollection(),collectionGroup()vàdatabase(). - Quyền
allow get: Được kích hoạt bởi giai đoạndocuments(), được xử lý tương tự như thao tácgettheo lô. - Giai đoạn giá trị cố định: Giai đoạn
literals()không đọc từ cơ sở dữ liệu nhưng có thể phát sinh chi phí. Để ngăn chặn hành vi sai trái, bạn phải kết hợp thẻ này với một giai đoạn khác (chẳng hạn nhưcollection()) mà các quy tắc có thể xác minh.
Các giai đoạn sửa đổi trường
Các quy tắc chỉ hoạt động trên dữ liệu được lưu trữ chứ không hoạt động trên các giá trị phái sinh. Nếu một quy trình bao gồm các giai đoạn sửa đổi trường (Ví dụ: add_fields(...), replace_with(...), select(...), remove_fields(...)), thì công cụ Quy tắc sẽ ngừng áp dụng các điều kiện lọc sau khi gặp giai đoạn đó. Để đảm bảo các quy tắc hoạt động như mong đợi, hãy đặt các giai đoạn lọc (tức là where) trước mọi giai đoạn có thể sửa đổi các tài liệu được lưu trữ ban đầu.
Ví dụ: hãy xem quy tắc bảo mật sau:
match /databases/{database}/documents {
match /cities/{city} {
// Allow the user to read data if the document has the 'visibility'
// field set to 'public'
allow read: if resource.data.visibility == 'public';
}
}
Bị từ chối: Quy tắc này từ chối quy trình sau đây vì giai đoạn addFields xảy ra trước khi lọc các tài liệu có visibility là public:
const results = await db.pipeline()
.collection("/cities")
// Filters after a modification stage are ignored by Rules.
.addFields(constant(1000).as("population"))
.where(eq(field("visibility"), constant("public")))
.execute();
Được phép: Quy tắc này cho phép quy trình sau vì giai đoạn where(eq(field("visibility"), constant("public"))) xảy ra trước mọi giai đoạn sửa đổi:
const results = await db.pipeline()
.collection("/cities")
.where(eq(field("visibility"), constant("public")))
.addFields(constant(1000).as("population"))
.execute();