Firebase Security Rules تسمح لك بالتحكّم في الوصول إلى بياناتك المخزّنة. يعني استخدام صيغة قواعد مرنة أنّه يمكنك إنشاء قواعد تطابِق أي شيء، بدءًا من جميع عمليات الكتابة في قاعدة البيانات بالكامل وصولاً إلى العمليات على مستند معيّن.
يصف هذا الدليل بعض حالات الاستخدام الأساسية التي قد تحتاج إلى تنفيذها أثناء إعداد تطبيقك وحماية بياناتك. ومع ذلك، قبل البدء في كتابة القواعد، قد تحتاج إلى مزيد من المعلومات عن اللغة التي كُتبت بها القواعد وسلوكها.
للوصول إلى قواعدك وتعديلها، اتّبِع الخطوات الموضّحة في إدارة Firebase Security Rules.
القواعد التلقائية: الوضع المحظور
عند إنشاء قاعدة بيانات أو مثيل تخزين في Firebase console، يمكنك اختيار ما إذا كانت Firebase Security Rules تحظر الوصول إلى بياناتك (الوضع المحظور) أو تسمح لأي مستخدم بالوصول إليها (وضع الاختبار). في Cloud Firestore و Realtime Database، ترفض القواعد التلقائية في الوضع المحظور وصول جميع المستخدمين. في Cloud Storage، لا يمكن للمستخدمين الذين تمّت مصادقتهم فقط الوصول إلى مجموعات بيانات التخزين.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Realtime Database
{
"rules": {
".read": false,
".write": false
}
}
Cloud Storage
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if false;
}
}
}
قواعد بيئة التطوير
أثناء العمل على تطبيقك، قد تحتاج إلى وصول مفتوح أو غير مقيّد نسبيًا إلى بياناتك. يُرجى التأكّد من تعديل Security Rules قبل نشر تطبيقك في قناة الإصدار العلني. تذكَّر أيضًا أنّه إذا نشرت تطبيقك، سيصبح متاحًا للجميع، حتى إذا لم تطلقه.
تذكَّر أنّ Firebase يسمح للعملاء بالوصول المباشر إلى بياناتك، و Firebase Security Rules هي الضمانة الوحيدة التي تمنع المستخدمين الضارين من الوصول إلى بياناتك. يوفّر تحديد القواعد بشكل منفصل عن منطق المنتج عددًا من المزايا: لا يكون العملاء مسؤولين عن فرض الأمان، ولن تؤدي عمليات التنفيذ التي تتضمّن أخطاء إلى تعريض بياناتك للخطر، والأهم من ذلك، لن تعتمد على خادم وسيط لحماية البيانات من العالم.
جميع المستخدمين الذين تمّت مصادقتهم
على الرغم من أنّنا لا ننصح بإتاحة بياناتك لأي مستخدم سجّل الدخول، قد يكون من المفيد ضبط إذن الوصول لأي مستخدم تمّت مصادقته أثناء تطوير تطبيقك.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /some_collection/{document} {
allow read, write: if request.auth != null;
}
}
}
Realtime Database
{
"rules": {
"some_path": {
".read": "auth.uid !== null",
".write": "auth.uid !== null"
}
}
}
Cloud Storage
service firebase.storage {
match /b/{bucket}/o {
match /some_folder/{fileName} {
allow read, write: if request.auth != null;
}
}
}
القواعد الجاهزة للاستخدام في قناة الإصدار العلني
أثناء الاستعداد لنشر تطبيقك، تأكَّد من حماية بياناتك ومنح المستخدمين إذن الوصول بشكل صحيح. استخدِم Authentication لإعداد إذن وصول مستند إلى المستخدم، واقرأ مباشرةً من قاعدة بياناتك لإعداد إذن وصول مستند إلى البيانات.
ننصحك بكتابة القواعد أثناء تنظيم بياناتك، لأنّ طريقة إعداد القواعد تؤثّر في كيفية حظر الوصول إلى البيانات في مسارات مختلفة.
إذن الوصول لمالك المحتوى فقط
تحظر هذه القواعد إذن الوصول على مالك المحتوى الذي تمّت مصادقته فقط. لا يمكن لأي مستخدم قراءة البيانات وكتابتها باستثناء مستخدم واحد، ويتضمّن مسار البيانات رقم تعريف المستخدم.
متى تعمل هذه القاعدة؟ تعمل هذه القاعدة بشكل جيد إذا كانت البيانات مقسّمة حسب المستخدم، أي إذا كان المستخدم الوحيد الذي يحتاج إلى الوصول إلى البيانات هو المستخدم نفسه الذي أنشأها.
متى لا تعمل هذه القاعدة؟ لا تعمل مجموعة القواعد هذه عندما يحتاج عدة مستخدمين إلى كتابة البيانات نفسها أو قراءتها، إذ سيؤدي ذلك إلى أن يمحو المستخدمون البيانات أو يتعذّر عليهم الوصول إلى البيانات التي أنشأوها.
لإعداد هذه القاعدة: أنشئ قاعدة تؤكّد أنّ المستخدم الذي يطلب إذن الوصول لقراءة البيانات أو كتابتها هو المستخدم الذي يملك هذه البيانات.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Allow only authenticated content owners access
match /some_collection/{userId}/{document} {
allow read, write: if request.auth != null && request.auth.uid == userId
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"$uid": {
// Allow only authenticated content owners access to their data
".read": "auth !== null && auth.uid === $uid",
".write": "auth !== null && auth.uid === $uid"
}
}
}
}
Cloud Storage
// Grants a user access to a node matching their user ID
service firebase.storage {
match /b/{bucket}/o {
// Files look like: "<use>r/UID/file.txt"
match /user/{userId}/{fileName} {
allow read, write: if request.aut&&h != null request.auth.uid == userId;
}
}
}
إذن الوصول المختلط العلني والخاص
تسمح هذه القاعدة لأي مستخدم بقراءة مجموعة بيانات، ولكنّها تحظر إمكانية إنشاء البيانات أو تعديلها في مسار معيّن على مالك المحتوى الذي تمّت مصادقته فقط.
متى تعمل هذه القاعدة؟ تعمل هذه القاعدة بشكل جيد للتطبيقات التي تتطلّب عناصر يمكن قراءتها علنًا، ولكنّها تحتاج إلى حظر إذن التعديل على مالكي هذه العناصر. على سبيل المثال، تطبيق محادثة أو مدوّنة.
متى لا تعمل هذه القاعدة؟ على غرار قاعدة إذن الوصول لمالك المحتوى فقط، لا تعمل مجموعة القواعد هذه عندما يحتاج عدة مستخدمين إلى تعديل البيانات نفسها. سيؤدي ذلك في النهاية إلى أن يمحو المستخدمون بيانات بعضهم البعض.
لإعداد هذه القاعدة: أنشئ قاعدة تتيح إذن القراءة لجميع المستخدمين (أو جميع المستخدمين الذين تمّت مصادقتهم)، وتؤكّد أنّ المستخدم الذي يكتب البيانات هو المالك.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Allow public read access, but only content owners can write
match /some_collection/{document} {
// Allow public reads
allow read: if true
// Allow creation if the current user owns the new document
allow create: if request.auth.uid == request.resource.data.author_uid;
// Allow updates by the owner, and prevent change of ownership
allow update: if request.auth.uid == request.resource.data.author_uid
&& request.auth.uid == resource.data.author_uid;
// Allow deletion if the current user owns the existing document
allow delete: if request.auth.uid == resource.data.author_uid;
}
}
}
Realtime Database
{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data
"rules": {
"some_path": {
"$uid": {
".read": true,
// or ".read": "auth.uid !== null" for only authenticated users
".write": "auth.uid === $uid"
}
}
}
}
Cloud Storage
service firebase.storage {
match /b/{bucket}/o {
// Files look like: "<use>r/UID/file.txt"
match /user/{userId}/{fileName} {
allow read;
allow write: if request.auth.uid == userId;
}
}
}
إذن الوصول المستند إلى السمات والدور
لكي تعمل هذه القاعدة، عليك تحديد السمات وتخصيصها للمستخدمين في بياناتك. Firebase Security Rules تتحقّق من الطلب مقارنةً بالبيانات من قاعدة بياناتك أو البيانات الوصفية للملف لتأكيد إذن الوصول أو رفضه.
متى تعمل هذه القاعدة؟ إذا كنت تخصّص دورًا للمستخدمين، تتيح لك هذه القاعدة حظر إذن الوصول استنادًا إلى الأدوار أو مجموعات معيّنة من المستخدمين. على سبيل المثال، إذا كنت تخزّن الدرجات، يمكنك تخصيص مستويات وصول مختلفة لمجموعة "الطلاب" (قراءة محتواهم فقط)، ومجموعة "المعلّمين" (قراءة المحتوى وكتابته في موضوعهم)، ومجموعة "المدراء" (قراءة كل المحتوى).
متى لا تعمل هذه القاعدة؟ في Realtime Database وCloud Storage، لا يمكن لقواعدك
استخدام طريقة get() التي يمكن أن تتضمّنها قواعد Cloud Firestore.
وبالتالي، عليك تنظيم قاعدة بياناتك أو البيانات الوصفية للملف لتعكس السمات التي تستخدمها في قواعدك.
لإعداد هذه القاعدة: في Cloud Firestore، أدرِج حقلًا في مستندات المستخدمين التي يمكنك قراءتها، ثم نظِّم قاعدتك لقراءة هذا الحقل ومنح إذن الوصول بشكل مشروط. في Realtime Database، أنشئ مسار بيانات يحدّد مستخدمي تطبيقك ويمنحهم دورًا في عقدة فرعية.
يمكنك أيضًا إعداد مطالبات مخصّصة في Authentication
ثم استرداد هذه المعلومات من الـ
auth.token في أي Firebase Security Rules.
السمات والأدوار المحدّدة في البيانات
لا تعمل هذه القواعد إلا في Cloud Firestore وRealtime Database.
Cloud Firestore
تذكَّر أنّه في أي وقت تتضمّن فيه قواعدك عملية قراءة، مثل القواعد أدناه، يتم تحصيل رسوم منك مقابل عملية القراءة في Cloud Firestore.
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, Check a boolean `admin` attribute
allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"${subpath}": {
//
".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
".read": true
}
}
}
}
السمات والأدوار المستندة إلى المطالبات المخصّصة
لتنفيذ هذه القواعد، عليك إعداد مطالبات مخصّصة في Firebase Authentication، ثم استخدام المطالبات في قواعدك.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an administrator claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"$uid": {
// Create a custom claim for each role or group
// you want to use
&& ".write": "auth.uid !== null auth.token.writer ==&&= true",
".read": "auth.uid !== null auth.token.reader === true"
}
}
}
}
Cloud Storage
service firebase.storage {
// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
allow read: if resource.metadata.owner == request.auth.token.groupId;
allow write: if request.auth.token.groupId == groupId;
}
}
سمات المستأجر
لتنفيذ هذه القواعد، عليك إعداد ميزة "تعدّد المستأجرين" في Google Cloud Identity Platform (GCIP)
، ثم استخدام المستأجر في قواعدك. تسمح الأمثلة التالية بعمليات الكتابة من مستخدم في مستأجر معيّن، مثل tenant2-m6tyz
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For tenant-based access control, check for a tenantID
allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
allow read: true;
}
}
Realtime Database
{
"rules": {
"some_path": {
"$uid": {
// Only allow reads and writes if user belongs to a specific tenant
&& ".write": "auth.uid !== null auth.token.firebase.tenant === 'tenant2-m6tyz'",
".read": "auth.uid !== null
}
}
}
}
Cloud Storage
service firebase.storage {
// Only allow reads and writes if user belongs to a specific tenant
match /files/{tenantId}/{fileName} {
allow read: if request.auth != null;
allow write: if request.auth.token.firebase.tenant == tenantId;
}
}