Mặc dù các thao tác trong quy trình cung cấp một tập hợp tính năng phong phú, nhưng công cụ Quy tắc chỉ nhận dạng các bộ lọc so sánh (ví dụ: >) và logic (ví dụ: or) để đảm bảo
tính thoả mãn và bảo mật của ràng buộc.
Biểu thức bộ lọc được hỗ trợ
Để các thao tác trong quy trình bị ràng buộc trong phạm vi do quy tắc của bạn đặt ra, quy trình đó phải sử dụng các toán tử logic và 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:
- 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 ngữ 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 trong quy trình.
Thuộc tính được hỗ trợ
Công cụ mới tiếp tục 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 lượt kiểm tra quy tắc của thao tác trong quy trình 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ý và quyền trong giai đoạn quy trình
Có nhiều giai đoạn quy trình ánh xạ đến 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ácgethàng loạt. - Giai đoạn theo nghĩa đen: 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 lạm dụng, bạn phải ghép giai đoạn này với một giai đoạn khác (nhưcollection()) có thể được quy tắc xác minh.
Giai đoạn sửa đổi trường
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ị được suy ra. 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 ràng buộc bộ lọc sau khi gặp giai đoạn đó. Để đảm bảo quy tắc hoạt động như dự kiến, hãy đặt các giai đoạn bộ lọc (tức là where) trước mọi giai đoạn có thể sửa đổi 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 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();