Arabic (العربية/عربي) translation by Ali Atwa (you can also view the original English article)
توفر الفيرباس لقواعد البيانات اوامر لحماية بيانتك و هيكلها من المستخدمين الغير موثقين
في هذا الدرس سوف اشرح كيف تهيئ الاوامر الخاصه بقاعدة البيانات حتى يتمكن المستخدمين الموثقين الدخول اليها سواء لقراءة و كتابة بيانات واسشرح ايضا كيفية تهيئة محتوى البيانات لتسهيل عملية تامينها.
المشكلة
لنفترض ان لدينا بيانات بصيغة json في قاعدة البيانات كما في المثال التالي:
{ "users" : { "user1" : { "firstName" : "Chike", "lastName" : "Mgbemena", "age": "89" "phoneNumber" : "07012345678" }, "user2" : { "firstName" : "Godswill", "lastName" : "Okwara", "age": "12" "phoneNumber" : "0701234" }, "user3" : { "firstName" : "Onu", "lastName" : 543, "age": 90 "phoneNumber" : "07012345678" }, ... } }
بالنظر لقاعدة البيانات ، يتضح وجود ثلاث مشاكل في البيانات:
- المستخدمان
user1
&user3
لديهم نفس رقم الهاتف. نريد جعلهم مختلفين
-
user3
لديه رقم لاسمه بدلا من ان يكون المتغير نص -
user2
لديه فقط 7 ارقام في رقم الهاتف بدلا من 11 - قيمة العمر لـ user1 و user2 نصا بينما لـ user3 رقم
مع كل هذه الاخطاء، نحن نفقد قيمة البيانات. في الخطوات التالية ساريك كيف نمنع حدوث هذا.
صلاحيه القواعد
لدى الفيرباس قواعد امان متنوعه:
النوع | الوظيفه |
---|---|
.read | توضح ما اذا كان مسموح بقراءة البيانات بالنسبة للمستخدمين الاخرين. |
.write | توضح ما اذا كان مسموح بتحرير البيانات |
.validate | توضح ما اذا كانت البيانات المدخلة مناسبة من حيث نوعها كمتغير او اذا كان عنصر ناقص. |
.indexOn | تستخدم لترتيب البيانات حسب ترتيب معين. |
لمعرفة المزيد حول صلاحية القواعد Firebase docs
هذه قواعد صلاحيه users
في قاعدة البيانات
{ "rules": { "users": { // users is readable by anyone ".read": true, // users is writable by anyone ".write": true } } }
هذا سيء لانها تسمح لاي مستخدم للوصول للبيانات سواء القراءة و الكتابه اي مستخدم لديه صلاحيه الخول للمسار /users/
واي مسار مرافق له ليس فقط هذا بل اي بيانات تخص تخص المستخدم
التحكم بقواعد الامان
{ "rules": { "users": { "$uid": { ".read": "auth.uid == $uid", ".write": "auth.uid == $uid", } } } }
بهذه القواعد نحن نخصص الدخول للبيانات لصاجبها فقط. ليس هذا فقط، يمكن للمستخدمين قراءة و تحرير بياناتهم فقط. يمكنا تحقيق هذا باستخدام $uid
هذا المتغير يمثل الرقم التعريفي للمستخدم (يبدا المتغير برمز $
) على سبيل المثال الدخول للمسارusers/user1
، $uid/
هو "user1"
تاليا نحن نستخدم المتغير auth
الذي يمثل المستخدم الموثق هذا المتغير معرف مسبقا من قبل سيرفر الفيرباس. في السطر 5و6 نحن نسمح فقط للمستخدم الموثق بنفس الرقم التعريفي الوصول الى بياناته للتحرير و القراءة وبعبارة أخرى، لكل مستخدم، يتم منح حق الوصول لتحرير وقراءة إلى/<users/<uid>/
، حيث <uid>
يمثل الرقم التعريفي للمستخدم الموثق.
متغيرات اخرى معرفه مسبقا من قبل سيرفر الفيرباس:
now | الوقت الحالي بالمللي ثانيه على نظام لينيكس ايبوش. |
root |
RuleDataSnapshot يمثل هذا المتغير المسار الاساسي لقواعد البيانات. |
newData |
RuleDataSnapshot يمثل البيانات المدخلة مسبقا. يتضمن البيانات المدخلة حديثا والموجوده مسبقا |
data | RuleDataSnapshot يمثل البيانات المدخلة مسبقا. |
auth | يمثل المتغير الرمز الخاص بالمستخدم الموثق |
لمعرفة المزيد حول المتغيرات المسبقة التعريف من قبل سيرفر الفيرباس Firebase docs
تنظيم البيانات
باستخدام قواعد الفيرباس يمكننا ان نحدد نوعية مدخلات قواعد البيانات من حيث المتغيرات
على سبيل المثال في القواعد الاتيه في كلا من السطر 8 و 11 نحن نتاكد ان البيانات الداخلة لكلا المتغيرين الاسم الاول والاخير ان يكون نصا. في السطر 14 نحن نتاكد ان متغير العمر رقم واخيرا في السطر 17و 18 نحن نفرض ان رقم الهاتف نص بطول 11 حرف
{ "rules": { "users": { "$uid": { ".read": "auth.uid == $uid", ".write": "auth.uid == $uid", "firstName": { ".validate": "newData.isString()" }, "lastName": { ".validate": "newData.isString()" }, "age": { ".validate": "newData.isNumber()" }, "phoneNumber": { ".validate": "newData.isString() && newData.val().length == 11" }, } } } }
لكن كيف نمنع تكرار رقم الهواتف؟
منع التكرار
ساريك لاحقا كيفية منع تكرار ارقام الهواتف
الخطوه الاولى: تنظيم مسار البيانات
اولا نحتاج تعديل المسار الاساسي لتضمين هذا المسار /phoneNumbers/
لذلك اثناء اضافه مستخدم جديد، سنضيف ايضا رقم هاتف المستخدم لهذا المسار عندما ينجح التحقق سوف يكون شكل البيانات هكذا:
{ "users" : { "user1" : { "firstName" : "Chike", "lastName" : "Mgbemena", "age": 89, "phoneNumber" : "07012345678" }, "user2" : { "firstName" : "Godswill", "lastName" : "Okwara", "age": 12, "phoneNumber" : "06034345453" }, "user3" : { "firstName" : "Onu", "lastName" : "Emeka", "age": 90, "phoneNumber" : "09034564543" }, ... }, "phoneNumbers" : { "07012345678": "user1", "06034345453": "user2", "09034564543": "user3", ... } }
الخطوة الثانية: مراعاة تنظيم البيانات
نحن نحتاج لتعديل قواعد الامان لتنظيم البيانات
{ "rules": { "users": { "$uid": { ... "phoneNumber": { ".validate": "newData.isString() && newData.val().length == 11 && !root.child('phoneNumbers').child(newData.val()).exists()" }, } } } }
هنا نحن نتاكد من ان رقم الهاتف فريد من خلال المسار /phoneNumbers/
مع اعطاء رقم الهاتف كرقم تعريفي بمعنى اخر، نحن نفحص رقم الهاتف للتاكد هل هو مسجل من قبل مستخدم اخر ام لا. لو لم يسجل من قبل فان التحقق سينجح و عمليه الكتابة سوف تقبل
سيحتاج تطبيقك لاضافه رقم الهاتف لقائمة ارقام الهاتف اثناء اضافة مستخدم جديد وازالة رقم هاتف المستخدم لو ازيل المستخدم.
محاكاة التحقق وقواعد الامان
يمكنك محاكاة قواعد الامان من خلال لوحة التحكم الفيرباس وذلك بالضغط على زر المحاكاة اضف قواعد المان ثن حدد نوع المحاكاة سواء قراءة ام كتابه ثم ادخل بعض البيانات في المسار واضغط على زر تنفيذ (Run).
لو كانت قيمة متغير الاسم الاول رقم بدلا من نص، فإن التحقق سيفشل و يعطي الدخول مرفوض:
الخلاصه
في هذا الدرس، تعلمت اساسيات حماية قواعد البيانات للفيرباس: كيفية منع المستخدمين الغر موثقين من الوصول للبيانات والتاكد من ان تكون البيانات منظمة
لمعرفة المزيد عن مبادئ قواعد البيانات راجع المصادر الرسمية. ويمكنك ايضا مراجعه بعض دروس والكورسات عن الفيرباس هنا على اينفاتو تتس!
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post