توفر قواعد أمان Firebase التحكم في الوصول والتحقق من صحة البيانات بتنسيق يدعم مستويات متعددة من التعقيد. لإنشاء أنظمة وصول تستند إلى المستخدم والأدوار تحافظ على أمان بيانات المستخدمين ، استخدم مصادقة Firebase مع قواعد أمان Firebase.
تحديد المستخدمين
تحدد المصادقة المستخدمين الذين يطلبون الوصول إلى بياناتك وتوفر هذه المعلومات كمتغير يمكنك الاستفادة منه في قواعدك. يحتوي متغير auth
على المعلومات التالية:
-
uid
: معرف مستخدم فريد يتم تعيينه للمستخدم الطالب. -
token
: خريطة القيم التي تم جمعها بواسطة المصادقة.
يحتوي متغير auth.token
على القيم التالية:
مجال | وصف |
---|---|
email | عنوان البريد الإلكتروني المرتبط بالحساب ، إن وجد. |
email_verified | true إذا كان المستخدم قد تحقق من أن لديه حق الوصول إلى عنوان email . يقوم بعض الموفرين بالتحقق تلقائيًا من عناوين البريد الإلكتروني التي يمتلكونها. |
phone_number | رقم الهاتف المرتبط بالحساب ، إن وجد. |
name | اسم عرض المستخدم ، إذا تم تعيينه. |
sub | معرّف Firebase UID الخاص بالمستخدم. هذا فريد داخل المشروع. |
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
يحتوي أيضًا على أي مطالبات مخصصة تحددها.
عندما لا يتم تسجيل دخول المستخدم الذي يطلب الوصول ، يكون متغير auth
null
. يمكنك الاستفادة من هذا في القواعد الخاصة بك ، على سبيل المثال ، إذا كنت تريد قصر الوصول للقراءة على المستخدمين المصادق عليهم - auth != null
. ومع ذلك ، نوصي عمومًا بالحد من الوصول للكتابة بشكل أكبر.
لمزيد من المعلومات حول متغير auth
، راجع الوثائق المرجعية لـ Cloud Firestore و Realtime Database و Cloud Storage .
الاستفادة من معلومات المستخدم في القواعد
من الناحية العملية ، فإن استخدام المعلومات المصادق عليها في قواعدك يجعل قواعدك أكثر قوة ومرونة. يمكنك التحكم في الوصول إلى البيانات بناءً على هوية المستخدم.
في القواعد الخاصة بك ، حدد كيف تتطابق المعلومات الموجودة في متغير auth
- معلومات مستخدم الطالب - مع معلومات المستخدم المرتبطة بالبيانات المطلوبة.
على سبيل المثال ، قد يرغب تطبيقك في التأكد من أن المستخدمين يمكنهم قراءة بياناتهم الخاصة وكتابتها فقط. في هذا السيناريو ، قد ترغب في وجود تطابق بين المتغير auth.uid
ومعرف المستخدم على البيانات المطلوبة:
سحابة Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
قاعدة بيانات الوقت الفعلي
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
سحابة التخزين
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
تحديد معلومات المستخدم المخصصة
يمكنك زيادة الاستفادة من متغير auth
لتحديد الحقول المخصصة المخصصة لمستخدمي تطبيقك.
على سبيل المثال ، افترض أنك تريد إنشاء دور "مسؤول" يتيح الوصول للكتابة على مسارات معينة. يمكنك تعيين هذه السمة للمستخدمين ، ثم الاستفادة منها في القواعد التي تمنح الوصول على المسارات.
في Cloud Firestore ، يمكنك إضافة حقل مخصص إلى مستندات المستخدمين واسترداد قيمة هذا الحقل بقراءة مضمنة في قواعدك. لذلك ، ستبدو القاعدة المستندة إلى المسؤول مثل المثال التالي:
سحابة Firestore
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
read: if request.auth != null;
}
}
يمكنك الوصول إلى المطالبات المخصصة في القواعد بعد إنشاء مطالبات مخصصة في المصادقة. يمكنك بعد ذلك الإشارة إلى هذه المطالبات المخصصة باستخدام المتغير auth.token
.
سحابة Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin 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";
}
}
}
قاعدة بيانات الوقت الفعلي
{
"rules": {
"some_path/$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true"
".read": "auth.uid !== null"
}
}
}
سحابة التخزين
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
لمشاهدة المزيد من الأمثلة على القواعد الأساسية التي تستفيد من المصادقة ، راجع قواعد الأمان الأساسية .