قاعده: انواع
.خواندن
به یک مشتری دسترسی خواندن به مکان پایگاه داده بیدرنگ Firebase را می دهد.
یک قانون .read
نوعی قانون امنیتی است که به یک کلاینت دسترسی خواندن به مکان پایگاه داده بیدرنگ Firebase را می دهد. مثلا:
".read": "auth != null && auth.provider == 'twitter'"
مقدار یک قانون .read
یک رشته است که به عنوان زیر مجموعه ای از نحو عبارت جاوا اسکریپت با چند تغییر رفتاری برای افزایش وضوح و صحت ارزیابی می شود. یک قانون .read
که اجازه خواندن یک مکان را می دهد، همچنین اجازه خواندن هر یک از فرزندان آن مکان را می دهد، حتی اگر فرزندان قوانین .read
خود را داشته باشند که با شکست مواجه شوند.
یک قانون .read
به همه متغیرهای قانون پایگاه داده بیدرنگ Firebase به جز newData
دسترسی دارد.
.نوشتن
به یک مشتری دسترسی نوشتن به مکان پایگاه داده بیدرنگ Firebase را می دهد.
یک قانون .write
نوعی قانون امنیتی است که به مشتری دسترسی نوشتن به یک مکان پایگاه داده بیدرنگ Firebase را می دهد. مثلا:
".write": "auth != null && auth.token.isAdmin == true"
مقدار یک قانون .write
یک رشته است که به عنوان زیر مجموعه ای از نحو عبارت جاوا اسکریپت با چند تغییر رفتاری برای افزایش وضوح و صحت ارزیابی می شود. یک قانون .write
که اجازه نوشتن در یک مکان را می دهد، همچنین اجازه نوشتن به هر نوادگان آن مکان را می دهد، حتی اگر فرزندان قوانین .write
خود را داشته باشند که با شکست مواجه شوند.
یک قانون .write
به همه متغیرهای قانون پایگاه داده بیدرنگ Firebase دسترسی دارد.
.تایید اعتبار
زمانی استفاده میشود که یک قانون .write
دسترسی داشته باشد تا اطمینان حاصل شود که دادههای نوشته شده با یک طرح خاص مطابقت دارند.
یک قانون .validate
زمانی استفاده می شود که به یک قانون .write
.دسترسی داده شود تا اطمینان حاصل شود که داده های نوشته شده با استاندارد خاصی مطابقت دارند. علاوه بر اعطای دسترسی .write
، قبل از مجاز شدن نوشتن، همه قوانین .validate
. مثلا:
".validate": "newData.hasChildren(['name', 'age'])"
مقدار یک قانون .validate
یک رشته است که به عنوان زیر مجموعه ای از نحو عبارت جاوا اسکریپت با چند تغییر رفتاری برای افزایش وضوح و صحت ارزیابی می شود.
یک قانون .validate
به همه متغیرهای قانون پایگاه داده بیدرنگ Firebase دسترسی دارد.
.indexOn
عملکرد پرس و جو را با گفتن به پایگاه داده بیدرنگ Firebase بهبود می بخشد.
قانون .indexOn
به سرورهای پایگاه داده بیدرنگ Firebase میگوید که کلیدهای خاصی را در دادههای شما فهرست کنند تا عملکرد جستارهای شما را بهبود بخشند. به عنوان مثال، با توجه به یک پایگاه داده با مجموعه ای از داده های دایناسورها، می توانیم به Firebase Realtime Database برای بهینه سازی پرس و جوها، قبل از اینکه از سرورها برگردانده شوند، با افزودن این قانون بگوییم:
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}
می توانید با مراجعه به بخش راهنمای امنیتی در مورد نمایه سازی داده های خود، اطلاعات بیشتری در مورد قانون .indexOn
کسب کنید.
قانون: متغیرها
اعتبار
متغیری که حاوی بار توکن است اگر کلاینت احراز هویت شده باشد، یا اگر کلاینت احراز هویت نشده باشد، null
.
پایگاه داده بیدرنگ Firebase به شما این امکان را می دهد که به راحتی در چندین ارائه دهنده داخلی احراز هویت کنید و توکن های احراز هویت را برای آنها ایجاد کنید. پس از احراز هویت کاربر با یکی از ارائه دهندگان داخلی، متغیر auth شامل موارد زیر خواهد بود:
رشته | شرح |
---|---|
provider | روش احراز هویت مورد استفاده (به عنوان مثال "رمز عبور"، "ناشناس"، "فیس بوک"، "github"، "google"، یا "twitter"). |
uid | یک شناسه کاربری منحصر به فرد، تضمین شده است که در همه ارائه دهندگان منحصر به فرد است. |
token | محتویات کد Firebase Auth ID. auth.token ببینید. |
به عنوان مثال، میتوانیم قانونی مانند زیر داشته باشیم که به کاربران اجازه میدهد تا زمانی که شناسه کاربری خود را با نظر ذخیره میکنند، نظر ایجاد کنند:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
}
}
}
همچنین میتوانیم قاعدهای مانند زیر ایجاد کنیم تا کاربران بتوانند نظرات خود را تا زمانی که با استفاده از فیسبوک وارد شدهاند ایجاد کنند:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && auth.provider == 'facebook'"
}
}
}
auth.token
متغیری که حاوی محتویات رمز Firebase Auth ID است.
رمز حاوی برخی یا همه کلیدهای زیر است:
رشته | شرح |
---|---|
email | آدرس ایمیل مرتبط با حساب، در صورت وجود. |
email_verified | true اگر کاربر تأیید کرده باشد که به آدرس email دسترسی دارد. برخی از ارائه دهندگان به طور خودکار آدرس های ایمیل خود را تأیید می کنند. |
phone_number | شماره تلفن مرتبط با حساب، در صورت وجود. |
name | نام نمایشی کاربر، در صورت تنظیم. |
sub | UID Firebase کاربر. این در یک پروژه منحصر به فرد است. |
firebase.identities | فرهنگ لغت همه هویت هایی که با حساب این کاربر مرتبط هستند. کلیدهای فرهنگ لغت می توانند یکی از موارد زیر باشند: email ، phone ، google.com ، facebook.com ، github.com ، twitter.com . مقادیر فرهنگ لغت آرایههایی از شناسههای منحصربهفرد برای هر ارائهدهنده هویت مرتبط با حساب است. برای مثال، auth.token.firebase.identities["google.com"][0] حاوی اولین شناسه کاربری Google مرتبط با حساب است. |
firebase.sign_in_provider | ارائهدهنده ورود به سیستم برای دریافت این رمز استفاده میکند. می تواند یکی از رشته های زیر باشد: custom ، password ، phone ، anonymous ، google.com ، facebook.com ، github.com ، twitter.com . |
firebase.tenant | شناسه مستاجر مرتبط با حساب، در صورت وجود. به عنوان مثال tenant2-m6tyz |
در صورت استفاده از احراز هویت سفارشی، auth.token
همچنین حاوی هر گونه ادعای سفارشی مشخص شده توسط توسعه دهنده است.
همه این مقادیر را می توان در قوانین استفاده کرد. به عنوان مثال، برای محدود کردن دسترسی به حسابهای Google مرتبط با آدرس gmail.com، میتوانیم این قانون را اضافه کنیم:
{
"rules": {
".read": "auth != null",
"gmailUsers": {
"$uid": {
".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
}
}
}
}
برای تکمیل، فیلدهای زیر نیز در auth.token
گنجانده شده است، اما بعید است که برای قوانین مفید باشند.
رشته | شرح |
---|---|
iss | صادر کننده ژتون. |
aud | مخاطب برای نشانه. |
auth_time | آخرین باری که کاربر با استفاده از دستگاهی که رمز را دریافت میکند، با یک اعتبارنامه احراز هویت کرد. |
iat | زمانی که توکن در آن صادر شد. |
exp | زمانی که توکن در آن منقضی می شود. |
مکان $
متغیری که می تواند برای ارجاع به کلید یک $location
که قبلاً در ساختار قانون استفاده شده است استفاده شود.
هنگامی که یک $location
در ساختار قوانین خود دارید، می توانید از یک متغیر مطابق با $
در عبارت قانون خود استفاده کنید تا نام فرزند واقعی خوانده یا نوشته شده را بدست آورید. بنابراین فرض کنید میخواهیم به هر کاربر دسترسی خواندن و نوشتن به مکان /users/<user>
خودش را بدهیم. می توانستیم استفاده کنیم:
{
"rules": {
"users": {
"$user": {
".read": "auth.uid === $user",
".write": "auth.uid === $user"
}
}
}
}
وقتی مشتری سعی می کند /users/barney
دسترسی پیدا کند، مکان پیش فرض $user
با $user
برابر با "barney" مطابقت دارد. بنابراین قانون .read
بررسی خواهد کرد که آیا auth.uid === 'barney'
. در نتیجه، خواندن
تنها در صورتی موفق خواهد شد که کلاینت با uid "barney" احراز هویت شود./users/barney
اکنون
شامل تعداد میلی ثانیه از زمان یونیکس طبق سرورهای پایگاه داده بیدرنگ Firebase است.
متغیر now
بر اساس سرورهای پایگاه داده بیدرنگ Firebase حاوی تعداد میلی ثانیه از زمان یونیکس است. به عنوان مثال، می توانید از این برای تأیید اینکه زمان created
توسط کاربر هرگز در آینده روی زمانی تنظیم نمی شود استفاده کنید:
{
"rules": {
"users": {
"$user": {
"created": {
".validate": "newData.val() < now"
}
}
}
}
}
ریشه
یک RuleDataSnapshot مربوط به داده های فعلی در ریشه پایگاه داده بیدرنگ Firebase شما.
متغیر root به شما یک RuleDataSnapshot مربوط به داده های فعلی در ریشه پایگاه داده بیدرنگ Firebase شما می دهد. می توانید از این برای خواندن هر داده ای در پایگاه داده خود در عبارات قانون خود استفاده کنید. برای مثال، اگر بخواهیم به کاربران اجازه دهیم که /comments
فقط در صورتی بخوانند که /users/<id>/active
آنها روی true تنظیم شده باشد، میتوانیم استفاده کنیم:
{
"rules": {
"comments": {
".read": "root.child('users').child(auth.uid).child('active').val() == true"
}
}
}
سپس، اگر /users/barney/active
حاوی مقدار true باشد، کاربری احراز هویت شده با uid "barney" می تواند در گره /comments
بنویسد.
داده ها
یک RuleDataSnapshot مربوط به دادههای جاری در پایگاه داده بیدرنگ Firebase در محل قانون در حال اجرا.
متغیر داده به شما یک RuleDataSnapshot مربوط به داده های فعلی در محل پایگاه داده قانون در حال اجرا را می دهد (برخلاف root، که داده های ریشه پایگاه داده شما را به شما می دهد).
به عنوان مثال، اگر میخواهید به هر کلاینت اجازه دسترسی به /users/<user>
را بدهید اگر /users/<user>/public
روی true تنظیم شده بود، میتوانید استفاده کنید:
{
"rules": {
"users": {
"$user": {
".read": "data.child('public').val() == true"
}
}
}
}
متغیر داده در قوانین .read
، .write
و .validate
موجود است.
داده های جدید
یک RuleDataSnapshot مربوط به دادههایی که در صورت مجاز بودن نوشتن به دست میآید.
برای قوانین .write
و .validate
بنابراین اگر میخواهید مطمئن شوید که هر کاربر یک نام و سن دارد، میتوانید از موارد زیر استفاده کنید:
{
"rules": {
"users": {
"$user": {
".read": true,
".write": true,
".validate": "newData.hasChildren(['name', 'age'])"
}
}
}
}
از آنجایی که newData دادههای موجود و دادههای جدید را ادغام میکند، حتی برای بهروزرسانیهای «جزئی» نیز به درستی رفتار میکند. مثلا:
var fredRef = firebase.database().ref("users/fred");
// Valid since we have a name and age.
fredRef.set({ name: "Fred", age: 19 });
// Valid since we are updating the name but there's already an age.
fredRef.child("age").set(27);
// Invalid since the .validate rule will no longer be true.
fredRef.child("name").remove();
متغیر newData در قوانین .read
موجود نیست زیرا داده جدیدی در حال نوشتن نیست. شما فقط باید از داده استفاده کنید.
RuleDataSnapshot: روش ها
val()
مقدار اولیه ( string
، number
، boolean
یا null
) را از این RuleDataSnapshot دریافت می کند.
مقدار بازگشتی : ( String
، Number
، Boolean
، Null
) - مقدار اولیه از این RuleDataSnapshot .
برخلاف DataSnapshot.val()
، فراخوانی val()
روی RuleDataSnapshot که دارای داده فرزند است، شی حاوی فرزندان را بر نمی گرداند. در عوض یک مقدار نگهبان ویژه را برمی گرداند. این تضمین می کند که قوانین همیشه می توانند بسیار کارآمد عمل کنند.
در نتیجه، همیشه باید از child()
برای دسترسی به کودکان استفاده کنید (به عنوان مثال data.child('name').val()
, نه data.val().name
).
این مثال فقط در صورتی اجازه خواندن را می دهد که فرزند isReadable در مکان خوانده شده روی true تنظیم شده باشد.
".read": "data.child('isReadable').val() == true"
کودک()
یک RuleDataSnapshot برای مکان در مسیر نسبی مشخص شده دریافت می کند.
آرگومان ها : String
childPath
- یک مسیر نسبی به مکان داده های فرزند.
مقدار بازگشتی : RuleDataSnapshot
- RuleDataSnapshot برای مکان فرزند.
مسیر نسبی می تواند یک نام ساده فرزند باشد (مثلاً "فرد") یا یک مسیر جدا شده با اسلش عمیق تر (مثلا "فرد/نام/اول"). اگر مکان فرزند داده ای نداشته باشد، یک RuleDataSnapshot خالی برگردانده می شود.
این مثال فقط در صورتی اجازه خواندن را می دهد که فرزند isReadable در مکان خوانده شده روی true تنظیم شده باشد.
".read": "data.child('isReadable').val() == true"
والدین()
یک RuleDataSnapshot برای مکان والد دریافت می کند.
مقدار بازگشتی : RuleDataSnapshot
- RuleDataSnapshot برای مکان والد.
اگر این نمونه به ریشه پایگاه داده بیدرنگ Firebase شما اشاره داشته باشد، هیچ پدر و مادری ندارد و parent()
از کار می افتد و باعث می شود که عبارت قانون فعلی نادیده گرفته شود (به عنوان یک شکست).
این مثال فقط در صورتی اجازه خواندن را می دهد که خواهر و برادر isReadable روی true تنظیم شده باشد.
".read": "data.parent().child('isReadable').val() == true"
hasChild (childPath)
اگر فرزند مشخص شده وجود داشته باشد، true را برمی گرداند.
Arguments : childPath
String
- یک مسیر نسبی به مکان یک فرزند بالقوه.
مقدار بازگشتی : Boolean - true
اگر داده در مسیر فرزند مشخص شده وجود داشته باشد. دیگر false
.
این مثال فقط در صورتی اجازه می دهد که داده ها حاوی "نام" فرزند باشند.
".validate": "newData.hasChild('name')"
دارای فرزندان ([فرزندان])
وجود فرزندان را بررسی می کند.
آرگومان ها : Array
children
اختیاری - آرایه ای از کلیدهای فرزند که همه باید وجود داشته باشند.
مقدار بازگشتی : Boolean
- اگر فرزندان (مشخص شده) وجود داشته باشند true
. دیگر false
.
اگر هیچ آرگومان ارائه نشود، اگر RuleDataSnapshot فرزندانی داشته باشد، مقدار true برمی گردد. اگر آرایهای از نامهای فرزند ارائه شود، تنها در صورتی درست برمیگردد که همه فرزندان مشخصشده در RuleDataSnapshot وجود داشته باشند.
این مثال فقط در صورتی اجازه می دهد که داده ها حاوی یک یا چند فرزند باشند.
".validate": "newData.hasChildren()"
این مثال فقط در صورتی اجازه می دهد که داده ها حاوی فرزندان "نام" و "سن" باشند.
".validate": "newData.hasChildren(['name', 'age'])"
وجود دارد()
اگر این RuleDataSnapshot حاوی دادهای باشد، true برمیگرداند.
مقدار بازگشتی : Boolean
- اگر RuleDataSnapshot حاوی دادهای باشد true
. دیگر false
.
اگر این RuleDataSnapshot حاوی داده ای باشد، تابع exists true را برمی گرداند. این صرفاً یک تابع راحت است زیرا data.exists()
معادل data.val() != null
است.
این مثال امکان نوشتن در این مکان را تا زمانی که دادههای موجود وجود ندارد، میدهد.
".write": "!data.exists()"
getPriority()
اولویت داده ها را در یک RuleDataSnapshot دریافت می کند.
مقدار بازگشتی : ( String
، Number
، Null
) - اولویت داده ها در این RuleDataSnapshot .
این مثال تضمین می کند که داده های جدید در حال نوشتن دارای اولویت هستند
".validate": "newData.getPriority() != null"
isNumber()
اگر این RuleDataSnapshot حاوی یک مقدار عددی باشد، مقدار true را برمیگرداند.
مقدار بازگشتی : Boolean
- اگر داده ها عددی باشند true
. دیگر false
.
این مثال تضمین می کند که داده های جدید نوشته شده دارای "سن" فرزند با مقدار عددی هستند.
".validate": "newData.child('age').isNumber()"
isString()
اگر این RuleDataSnapshot حاوی یک مقدار رشته باشد، مقدار true را برمیگرداند.
مقدار بازگشتی : Boolean
- true
اگر داده یک String
باشد. دیگر false
.
این مثال تضمین میکند که دادههای جدید نوشته شده دارای «نام» فرزند با مقدار رشته هستند.
".validate": "newData.child('name').isString()
isBoolean()
اگر این RuleDataSnapshot حاوی مقدار بولی باشد، مقدار true را برمیگرداند.
مقدار برگشتی : Boolean
- true
اگر داده ها Boolean
باشند. دیگر false
.
این مثال تضمین می کند که داده های جدید نوشته شده دارای فرزند "اکتیو" با مقدار بولی هستند.
".validate": "newData.child('active').isBoolean()"
رشته: خواص
طول
طول رشته را برمی گرداند.
مقدار بازگشتی : Number
- تعداد کاراکترهای رشته.
این مثال مستلزم داشتن رشته حداقل 10 کاراکتر است.
".validate": "newData.isString() && newData.val().length >= 10"
رشته: روش ها
حاوی (زیر رشته)
اگر رشته حاوی زیررشته مشخص شده باشد، مقدار true را برمی گرداند.
Arguments : substring
String
- رشته فرعی که باید جستجو کرد.
مقدار بازگشتی : Boolean
- اگر رشته حاوی زیررشته مشخص شده باشد true
. دیگر false
.
این مثال نیاز دارد که دادهها رشتهای حاوی «@» باشند.
".validate": "newData.isString() && newData.val().contains('@')"
با (زیر رشته) شروع می شود
اگر رشته با رشته فرعی مشخص شده شروع شود مقدار true را برمی گرداند.
Arguments : substring
String
- رشته فرعی که در ابتدا باید به دنبال آن باشید.
مقدار بازگشتی : Boolean
- اگر رشته حاوی زیررشته مشخص شده باشد true
. دیگر false
.
اگر auth.token.identifier
با "internal-" شروع شود، این مثال اجازه دسترسی به خواندن را می دهد.
".read": "auth.token.identifier.beginsWith('internal-')"
endsWith (زیر رشته)
اگر رشته با رشته فرعی مشخص شده خاتمه یابد مقدار true را برمی گرداند.
Arguments : substring
String
- رشته فرعی که در انتها باید به دنبال آن بگردید.
مقدار بازگشتی : Boolean
- true
اگر رشته به زیر رشته مشخص شده ختم شود. دیگر false
.
اگر auth.token.identifier
به "@company.com" ختم شود، این مثال اجازه دسترسی به خواندن را می دهد.
".read": "auth.token.identifier.endsWith('@company.com')"
جایگزینی (زیر رشته، جایگزینی)
یک کپی از رشته را با تمام نمونه های یک رشته فرعی مشخص شده با رشته جایگزین مشخص شده جایگزین می کند.
Arguments : substring String
- رشته فرعی که باید جستجو کرد. replacement String
- رشته ای برای جایگزینی رشته فرعی.
مقدار بازگشتی : String
- رشته جدید پس از جایگزینی رشته فرعی با جایگزین.
متد replace()
با متد replace()
جاوا اسکریپت تفاوت اندکی دارد زیرا تمام نمونه های یک زیررشته مشخص شده را با رشته جایگزین مشخص شده جایگزین می کند، نه فقط نمونه اول.
از آنجایی که نقطه در کلیدها مجاز نیست، باید قبل از ذخیره کردن رشتههای نقطهای از آنها فرار کنیم. یک مثال از این می تواند با آدرس های ایمیل باشد. فرض کنید ما لیستی از آدرس های ایمیل در لیست سفید در گره /whitelist/
خود داریم:
{
"user": {
"$uid": {
"email": <email>
}
},
"whitelist": {
"fred@gmail%2Ecom": true,
"barney@aol%2Ecom": true
}
}
ما میتوانیم قاعدهای ایجاد کنیم که فقط به کاربران اجازه میدهد در صورتی که ایمیل آنها در گره /whitelist/
باشد اضافه شوند:
{
"rules": {
"users": {
"$uid": {
".read": "true",
".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
}
}
}
}
toLowerCase()
یک کپی از رشته تبدیل شده به حروف کوچک را برمی گرداند.
مقدار بازگشتی : String
- رشته به حروف کوچک تبدیل شده است.
اگر auth.token.identifier
به عنوان تمام حروف کوچک در زیر /users
وجود داشته باشد، این مثال اجازه دسترسی به خواندن را می دهد.
".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"
toUpperCase()
یک کپی از رشته تبدیل شده به حروف بزرگ را برمی گرداند.
مقدار بازگشتی : String
- رشته به حروف بزرگ تبدیل شده است.
اگر auth.token.identifier
تمام حروف بزرگ در زیر /users
وجود داشته باشد، این مثال اجازه دسترسی به خواندن را می دهد.
".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"
کبریت (regex)
اگر رشته با عبارت منظم تعیین شده مطابقت داشته باشد، مقدار true را برمی گرداند.
مقدار بازگشتی : Boolean
- true
اگر رشته با عبارت منظم literal، regex مطابقت داشته باشد. دیگر false
.
مستندات کامل قوانین regex را ببینید.
اپراتورها
+ (افزودن)
برای افزودن متغیرها یا برای الحاق رشته ها استفاده می شود.
مثال زیر تضمین می کند که مقدار جدید مقدار موجود را دقیقاً یک عدد افزایش می دهد. این برای پیاده سازی شمارنده مفید است:
".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"
- (نفی یا تفریق)
برای نفی یک مقدار یا کم کردن دو مقدار در یک عبارت قوانین استفاده می شود.
این قانون اعتبارسنجی بررسی می کند که مقدار جدید معکوس مقدار فرزند در مکان است:
".validate": "newData.val() === -(data.child('quantity').val())"
مثال زیر از تفریق استفاده می کند تا اطمینان حاصل شود که فقط پیام های ده دقیقه آخر قابل خواندن هستند:
".read": "newData.child('timestamp').val() > (now - 600000)"
* (تکثیر کردن)
برای ضرب متغیرها در یک عبارت قوانین استفاده می شود.
این قانون اعتبارسنجی بررسی می کند که آیا مقدار جدید برابر است با محصول قیمت و مقدار (دو مقدار موجود):
".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"
/ (تقسیم)
برای تقسیم متغیرها در یک عبارت قوانین استفاده می شود.
در مثال زیر، قانون اعتبارسنجی اطمینان حاصل می کند که داده های ذخیره شده میانگین کل داده های ذخیره شده در جاهای دیگر باشد:
".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"
% (مدول)
برای یافتن باقیمانده تقسیم یک متغیر بر متغیر دیگر در عبارت قواعد استفاده می شود.
این قانون تأیید می کند که فقط اعداد زوج را می توان نوشت:
".validate": "newData.val() % 2 === 0"
=== (برابر)
برای بررسی اینکه آیا دو متغیر در یک عبارت قوانین دارای نوع و مقدار یکسان هستند یا خیر استفاده می شود.
قانون زیر از عملگر === برای اعطای دسترسی نوشتن فقط به صاحب حساب کاربری استفاده می کند. uid کاربر باید دقیقاً با کلید ( $user_id
) مطابقت داشته باشد تا قانون به درستی ارزیابی شود.
"users": {
".write": "$user_id === auth.uid"
}
!== (برابر نیست)
برای بررسی اینکه آیا دو متغیر در یک عبارت قوانین برابر نیستند یا خیر استفاده می شود.
قانون خواندن زیر تضمین می کند که فقط کاربرانی که وارد سیستم شده اند می توانند داده ها را بخوانند:
".read": "auth !== null"
&& (AND)
اگر هر دو عملوند درست باشند، به true ارزیابی می شود. برای ارزیابی شرایط چندگانه در یک عبارت قوانین استفاده می شود.
قانون اعتبارسنجی زیر بررسی میکند که دادههای جدید رشتهای کمتر از 100 کاراکتر باشند:
".validate": "newData.isString() && newData.val().length < 100"
|| (یا)
اگر یک عملوند در عبارت قواعد درست باشد، به true ارزیابی می کند.
در این مثال، تا زمانی که داده های قدیمی یا جدید وجود نداشته باشند، می توانیم بنویسیم. به عبارت دیگر، اگر در حال حذف یا ایجاد داده هستیم، اما داده ها را به روز نمی کنیم، می توانیم بنویسیم.
".write": "!data.exists() || !newData.exists()"
! (نه)
اگر عملوند منفرد آن نادرست باشد به true ارزیابی می کند. در عبارات قواعد، ! عملگر اغلب برای مشاهده اینکه آیا داده ها در یک مکان نوشته شده اند یا خیر استفاده می شود.
قانون زیر فقط در صورتی اجازه دسترسی به نوشتن را می دهد که هیچ داده ای در مکان مشخص شده وجود نداشته باشد:
".write": "!data.exists()"
> (بیشتر از)
برای بررسی اینکه آیا مقداری از مقدار دیگری در عبارت قواعد بزرگتر است یا خیر استفاده می شود.
این قانون اعتبارسنجی بررسی می کند که رشته ای که نوشته می شود یک رشته خالی نباشد:
".validate": "newData.isString() && newData.val().length > 0"
< (کمتر از)
برای بررسی اینکه آیا مقداری کمتر از مقدار دیگری در عبارت قواعد است یا خیر استفاده می شود.
این قانون اعتبارسنجی بررسی می کند که یک رشته کمتر از 20 کاراکتر باشد:
".validate": "newData.isString() && newData.val().length < 20"
>= (بزرگتر یا مساوی)
برای بررسی اینکه آیا مقداری بزرگتر یا مساوی با مقدار دیگری در عبارت قواعد است یا خیر استفاده می شود.
این قانون اعتبارسنجی بررسی می کند که رشته ای که نوشته می شود یک رشته خالی نباشد:
".validate": "newData.isString() && newData.val().length >= 1"
<= (کمتر از یا مساوی)
برای بررسی اینکه آیا یک مقدار کمتر یا مساوی با مقدار دیگری در عبارت قواعد است یا خیر استفاده می شود.
این قانون اعتبار سنجی تضمین می کند که داده های جدید نمی توانند در آینده اضافه شوند:
".validate": "newData.val() <= now"
? (اپراتور سه تایی)
برای ارزیابی یک عبارت قوانین شرطی استفاده می شود.
عملگر سه تایی سه عملوند می گیرد. عملوند قبل از ? شرط است. اگر شرط به درستی ارزیابی شود، عملوند دوم ارزیابی می شود. اگر شرط نادرست باشد، عملوند سوم ارزیابی می شود.
برای قانون اعتبارسنجی زیر، مقدار جدید می تواند یک عدد یا یک بولی باشد. اگر عدد است، باید بزرگتر از 0 باشد.
".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"