در حالی که عملیات Pipeline مجموعهای غنی از ویژگیها را ارائه میدهد، موتور Rules محدود به تشخیص فیلترهای مقایسهای (مثلاً > ) و منطقی (مثلاً or ) است تا از برآورده شدن محدودیتها و امنیت اطمینان حاصل شود.
عبارات فیلتر پشتیبانی شده
برای اینکه عملیات Pipeline به مرزهای تعیینشده توسط قوانین شما محدود شود، باید از عملگرهای منطقی و مقایسهای در برابر ثابتها استفاده کند. انواع فیلترهای زیر توسط موتور Rules شناخته میشوند:
- مقایسهها:
eq،neq،gt،gte،lt،lte،in،arrayContains. - منطقی:
and،or.
در اینجا چند مثال آورده شده است:
-
where(eq("foo", 2)) -
where(lt("foo", 2)) -
documents("/user/1", "/user/2").where(...)
درخواست ملک
شما میتوانید همچنان از شیء request برای اعتبارسنجی احراز هویت و زمینه پرسوجو استفاده کنید، اگرچه برخی از ویژگیهای موجود در پرسوجوهای استاندارد در عملیات Pipeline پشتیبانی نمیشوند.
ویژگیهای پشتیبانیشده
موتور جدید همچنان از ویژگیهای زیر پشتیبانی میکند:
-
request.auth: به شناسه کاربری (uid) و دادههای توکن (token) دسترسی دارد. -
request.method: عملیات را شناسایی میکند (برای مثال،get،list). -
request.path: مسیر منبعی که قرار است به آن دسترسی پیدا شود. -
request.time: نشانگر زمانی سمت سرور برای درخواست.
ویژگیهای پشتیبانی نشده
ویژگیهای request.query مانند limit ، offset و orderBy به دلیل پیچیدگی تعیین این مقادیر در پرسوجوهای چند مرحلهای، برای بررسی قوانین عملیات Pipeline پشتیبانی نمیشوند.
مدیریت و مجوزهای مرحله خط لوله
مراحل مختلفی در خط لوله وجود دارد که به عملیات جزئی خاص در قوانین امنیتی نگاشت میشوند:
-
allow list: توسط مراحلcollection()،collectionGroup()وdatabase()فعال میشود. -
allow getمجوزها: توسط مرحلهdocuments()فعال میشود که مشابه عملیاتgetدستهای با آن رفتار میشود. - مرحلهی لیترالها: مرحلهی
literals()از پایگاه داده نمیخواند اما میتواند هزینههایی را متحمل شود. برای جلوگیری از سوءاستفاده، باید با مرحلهی دیگری (مانندcollection()) جفت شود که بتوان آن را با قوانین تأیید کرد.
مراحل اصلاح مزرعه
قوانین فقط روی دادههای ذخیره شده عمل میکنند و نه روی مقادیر مشتق شده. اگر یک خط لوله شامل مراحلی باشد که فیلدها را تغییر میدهند (برای مثال، add_fields(...) ، replace_with(...) ، select(...) ، remove_fields(...) )، موتور قوانین پس از مواجهه با آن مرحله، اعمال محدودیتهای فیلتر را متوقف میکند. برای اطمینان از اینکه قوانین طبق انتظار کار میکنند، مراحل فیلتر خود را (یعنی where ) قبل از هر مرحلهای که میتواند اسناد ذخیره شده اصلی را تغییر دهد، قرار دهید.
برای مثال، قانون امنیتی زیر را در نظر بگیرید:
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';
}
}
رد شده : این قانون، خط لوله زیر را رد میکند زیرا مرحله addFields قبل از فیلتر کردن اسنادی که visibility 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();
مجاز : این قانون به خط لوله زیر اجازه میدهد زیرا مرحله where(eq(field("visibility"), constant("public"))) قبل از هرگونه مرحله اصلاح رخ میدهد:
const results = await db.pipeline()
.collection("/cities")
.where(eq(field("visibility"), constant("public")))
.addFields(constant(1000).as("population"))
.execute();