می توانید از Firebase Security Rules برای نوشتن داده های جدید بر اساس داده های موجود در پایگاه داده یا سطل ذخیره سازی خود به صورت مشروط استفاده کنید. همچنین میتوانید قوانینی بنویسید که اعتبارسنجی دادهها را با محدود کردن نوشتن بر اساس دادههای جدید در حال نوشتن اعمال میکنند. برای کسب اطلاعات بیشتر در مورد قوانینی که از داده های موجود برای ایجاد شرایط امنیتی استفاده می کنند، ادامه مطلب را بخوانید.
برای کسب اطلاعات بیشتر در مورد قوانین اعتبار سنجی داده، محصولی را در هر بخش انتخاب کنید.
محدودیت در داده های جدید
Cloud Firestore
اگر میخواهید مطمئن شوید که سندی که حاوی فیلد خاصی است ایجاد نشده است، میتوانید فیلد را در شرط allow
قرار دهید. برای مثال، اگر میخواهید ایجاد هر سندی را که حاوی فیلد ranking
است رد کنید، آن را در شرایط create
غیرمجاز خواهید کرد.
service cloud.firestore {
match /databases/{database}/documents {
// Disallow
match /cities/{city} {
allow create: if !("ranking" in request.resource.data)
}
}
}
Realtime Database
اگر میخواهید مطمئن شوید که دادههایی که حاوی مقادیر خاصی هستند به پایگاه داده شما اضافه نمیشوند، باید آن مقدار را در قوانین خود بگنجانید و اجازه نوشتن آن را نمیدهید. برای مثال، اگر میخواهید هر نوشتهای که حاوی مقادیر ranking
است را رد کنید، نوشتن را برای هر سندی با مقادیر ranking
ممنوع کنید.
{
"rules": {
// Write is allowed for all paths
".write": true,
// Allows writes only if new data doesn't include a `ranking` child value
".validate": "!newData.hasChild('ranking')
}
}
Cloud Storage
اگر میخواهید مطمئن شوید که فایلی که حاوی فراداده خاصی است ایجاد نمیشود، میتوانید متادیتا را در شرایط allow
قرار دهید. به عنوان مثال، اگر میخواهید ایجاد هر فایلی را که حاوی ابرداده ranking
است رد کنید، آن را در شرایط create
غیرفعال میکنید.
service firebase.storage {
match /b/{bucket}/o {
match /files/{allFiles=**} {
// Disallow
allow create: if !("ranking" in request.resource.metadata)
}
}
}
از داده های موجود در Firebase Security Rules استفاده کنید
Cloud Firestore
بسیاری از برنامه ها اطلاعات کنترل دسترسی را به صورت فیلدهایی روی اسناد در پایگاه داده ذخیره می کنند. Cloud Firestore Security Rules می توانند به صورت پویا دسترسی را بر اساس داده های سند مجاز یا رد کنند:
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to read data if the document has the 'visibility'
// field set to 'public'
match /cities/{city} {
allow read: if resource.data.visibility == 'public';
}
}
}
متغیر resource
به سند درخواستی اشاره دارد و resource.data
نقشه ای از تمام فیلدها و مقادیر ذخیره شده در سند است. برای اطلاعات بیشتر در مورد متغیر resource
، به مستندات مرجع مراجعه کنید.
هنگام نوشتن داده، ممکن است بخواهید داده های دریافتی را با داده های موجود مقایسه کنید. این به شما امکان میدهد کارهایی مانند اطمینان از تغییر نکردن یک فیلد، یا اینکه مقدار جدید حداقل یک هفته در آینده است، انجام دهید. در این مورد، اگر مجموعه قوانین شما اجازه نوشتن در انتظار را بدهد، متغیر request.resource
شامل وضعیت آینده سند است. برای عملیات update
که فقط زیرمجموعهای از فیلدهای سند را تغییر میدهند، متغیر request.resource
شامل وضعیت سند در انتظار پس از عملیات خواهد بود. برای جلوگیری از بهروزرسانیهای ناخواسته یا متناقض دادهها، میتوانید مقادیر فیلد را در request.resource
بررسی کنید:
service cloud.firestore {
match /databases/{database}/documents {
// Make sure all cities have a positive population and
// the name is not changed
match /cities/{city} {
allow update: if request.resource.data.population > 0
&& request.resource.data.name == resource.data.name;
}
}
}
Realtime Database
در Realtime Database ، از قوانین .validate
برای اجرای ساختارهای داده و اعتبارسنجی قالب و محتوای داده ها استفاده کنید. Rules پس از تأیید اینکه یک قانون .write
اجازه دسترسی می دهد، قوانین .validate
اجرا می کنند.
قوانین .validate
آبشاری نمی شوند. اگر هر قانون اعتبارسنجی در هر مسیر یا مسیر فرعی در قانون با شکست مواجه شود، کل عملیات نوشتن رد خواهد شد. علاوه بر این، تعاریف اعتبارسنجی فقط مقادیر غیر تهی را بررسی میکنند و متعاقباً هر درخواستی را که دادهها را حذف میکنند نادیده میگیرند.
قوانین .validate
زیر را در نظر بگیرید:
{
"rules": {
// write is allowed for all paths
".write": true,
"widget": {
// a valid widget must have attributes "color" and "size"
// allows deleting widgets (since .validate is not applied to delete rules)
".validate": "newData.hasChildren(['color', 'size'])",
"size": {
// the value of "size" must be a number between 0 and 99
".validate": "newData.isNumber() &&
newData.val() >= 0 &&
newData.val() <= 99"
},
"color": {
// the value of "color" must exist as a key in our mythical
// /valid_colors/ index
".validate": "root.child('valid_colors/' + newData.val()).exists()"
}
}
}
}
نوشتن درخواست ها در پایگاه داده با قوانین بالا نتایج زیر را به همراه خواهد داشت:
جاوا اسکریپت
var ref = db.ref("/widget"); // PERMISSION_DENIED: does not have children color and size ref.set('foo'); // PERMISSION DENIED: does not have child color ref.set({size: 22}); // PERMISSION_DENIED: size is not a number ref.set({ size: 'foo', color: 'red' }); // SUCCESS (assuming 'blue' appears in our colors list) ref.set({ size: 21, color: 'blue'}); // If the record already exists and has a color, this will // succeed, otherwise it will fail since newData.hasChildren(['color', 'size']) // will fail to validate ref.child('size').set(99);
هدف-C
FIRDatabaseReference *ref = [[[FIRDatabase database] reference] child: @"widget"]; // PERMISSION_DENIED: does not have children color and size [ref setValue: @"foo"]; // PERMISSION DENIED: does not have child color [ref setValue: @{ @"size": @"foo" }]; // PERMISSION_DENIED: size is not a number [ref setValue: @{ @"size": @"foo", @"color": @"red" }]; // SUCCESS (assuming 'blue' appears in our colors list) [ref setValue: @{ @"size": @21, @"color": @"blue" }]; // If the record already exists and has a color, this will // succeed, otherwise it will fail since newData.hasChildren(['color', 'size']) // will fail to validate [[ref child:@"size"] setValue: @99];
سویفت
var ref = FIRDatabase.database().reference().child("widget") // PERMISSION_DENIED: does not have children color and size ref.setValue("foo") // PERMISSION DENIED: does not have child color ref.setValue(["size": "foo"]) // PERMISSION_DENIED: size is not a number ref.setValue(["size": "foo", "color": "red"]) // SUCCESS (assuming 'blue' appears in our colors list) ref.setValue(["size": 21, "color": "blue"]) // If the record already exists and has a color, this will // succeed, otherwise it will fail since newData.hasChildren(['color', 'size']) // will fail to validate ref.child("size").setValue(99);
جاوا
FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("widget"); // PERMISSION_DENIED: does not have children color and size ref.setValue("foo"); // PERMISSION DENIED: does not have child color ref.child("size").setValue(22); // PERMISSION_DENIED: size is not a number Map<String,Object> map = new HashMap<String, Object>(); map.put("size","foo"); map.put("color","red"); ref.setValue(map); // SUCCESS (assuming 'blue' appears in our colors list) map = new HashMap<String, Object>(); map.put("size", 21); map.put("color","blue"); ref.setValue(map); // If the record already exists and has a color, this will // succeed, otherwise it will fail since newData.hasChildren(['color', 'size']) // will fail to validate ref.child("size").setValue(99);
استراحت
# PERMISSION_DENIED: does not have children color and size curl -X PUT -d 'foo' \ https://docs-examples.firebaseio.com/rest/securing-data/example.json # PERMISSION DENIED: does not have child color curl -X PUT -d '{"size": 22}' \ https://docs-examples.firebaseio.com/rest/securing-data/example.json # PERMISSION_DENIED: size is not a number curl -X PUT -d '{"size": "foo", "color": "red"}' \ https://docs-examples.firebaseio.com/rest/securing-data/example.json # SUCCESS (assuming 'blue' appears in our colors list) curl -X PUT -d '{"size": 21, "color": "blue"}' \ https://docs-examples.firebaseio.com/rest/securing-data/example.json # If the record already exists and has a color, this will # succeed, otherwise it will fail since newData.hasChildren(['color', 'size']) # will fail to validate curl -X PUT -d '99' \ https://docs-examples.firebaseio.com/rest/securing-data/example/size.json
Cloud Storage
هنگام ارزیابی قوانین، ممکن است بخواهید فراداده فایل در حال آپلود، دانلود، اصلاح یا حذف را نیز ارزیابی کنید. این به شما امکان میدهد قوانین پیچیده و قدرتمندی ایجاد کنید که کارهایی مانند فقط اجازه میدهد فایلهایی با انواع محتوای خاص آپلود شوند یا فقط فایلهای بزرگتر از اندازه معین حذف شوند.
شی resource
شامل جفتهای کلید/مقدار با ابردادههای فایل است که در یک شی Cloud Storage ظاهر شدهاند. این ویژگی ها را می توان در درخواست های read
یا write
برای اطمینان از یکپارچگی داده ها بررسی کرد. شی resource
، ابرداده های موجود در سطل Cloud Storage شما را بررسی می کند.
service firebase.storage {
match /b/{bucket}/o {
match /images {
match /{allImages=**} {
// Allow reads if a custom 'visibility' field is set to 'public'
allow read: if resource.metadata.visibility == 'public';
}
}
}
}
همچنین میتوانید از شی request.resource
در درخواستهای write
استفاده کنید (مانند آپلود، بهروزرسانی ابرداده، و حذف. شی request.resource
متادیتا را از فایل دریافت میکند که در صورت مجاز بودن write
نوشته میشود.
میتوانید از این دو مقدار برای جلوگیری از بهروزرسانیهای ناخواسته یا ناسازگار یا برای اعمال محدودیتهای برنامه، مانند نوع یا اندازه فایل استفاده کنید.
service firebase.storage {
match /b/{bucket}/o {
match /images {
// Cascade read to any image type at any path
match /{allImages=**} {
allow read;
}
// Allow write files to the path "images/*", subject to the constraints:
// 1) File is less than 5MB
// 2) Content type is an image
// 3) Uploaded content type matches existing content type
// 4) File name (stored in imageId wildcard variable) is less than 32 characters
match /{imageId} {
allow write: if request.resource.size < 5 * 1024 * 1024
&& request.resource.contentType.matches('image/.*')
&& request.resource.contentType == resource.contentType
&& imageId.size() < 32
}
}
}
}
فهرست کاملی از خواص موجود در شی resource
در مستندات مرجع موجود است.