Firebase Security Rules מספקת בקרת גישה ואימות נתונים בפורמט שתומך בכמה רמות מורכבות. כדי ליצור מערכות גישה מבוססות-משתמשים ומבוססות-תפקידים שישמרו על בטיחות נתוני המשתמשים, אפשר להשתמש ב-Firebase Authentication עם Firebase Security Rules.
זיהוי משתמשים
Authentication מזהה משתמשים שמבקשים גישה לנתונים שלכם ומספק את המידע הזה כמשתנה שאפשר להשתמש בו בכללים. המשתנה auth
מכיל את הפרטים הבאים:
-
uid
: מזהה משתמש ייחודי שהוקצה למשתמש ששלח את הבקשה. -
token
: מיפוי של הערכים שנאספו על ידי Authentication.
המשתנה auth.token
מכיל את הערכים הבאים:
שדה | תיאור |
---|---|
email |
כתובת האימייל שמשויכת לחשבון, אם יש כזו. |
email_verified |
true אם המשתמש אימת שיש לו גישה לכתובת email . חלק מהספקים מאמתים אוטומטית כתובות אימייל שנמצאות בבעלותם. |
phone_number |
מספר הטלפון שמשויך לחשבון, אם יש כזה. |
name |
השם המוצג של המשתמש, אם הוא מוגדר. |
sub |
מזהה המשתמש ב-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
כולל גם את הטענות המותאמות אישית שציינתם.
אם המשתמש שמבקש גישה לא מחובר לחשבון, המשתנה auth
הוא null
.
אפשר להשתמש בזה בכללים אם, לדוגמה, רוצים להגביל את גישת הקריאה למשתמשים מאומתים – auth != null
. עם זאת, באופן כללי מומלץ להגביל עוד יותר את הרשאות הכתיבה.
מידע נוסף על המשתנה auth
זמין במאמרי העזרה בנושא Cloud Firestore, Realtime Database ו-Cloud Storage.
שימוש בפרטי משתמשים בכללים
בפועל, שימוש במידע מאומת בכללים הופך את הכללים ליעילים וגמישים יותר. אתם יכולים לשלוט בגישה לנתונים על סמך זהות המשתמש.
בכללים, מגדירים איך המידע במשתנה auth
– פרטי המשתמש של שולח הבקשה – תואם לפרטי המשתמש שמשויכים לנתונים המבוקשים.
לדוגמה, יכול להיות שהאפליקציה שלכם תרצה לוודא שהמשתמשים יכולים רק לקרוא ולכתוב את הנתונים שלהם. בתרחיש הזה, תרצו שתהיה התאמה בין המשתנה auth.uid
לבין מזהה המשתמש בנתונים המבוקשים:
Cloud 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;
}
}
}
Realtime Database
{
"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"
}
}
}
}
Cloud Storage
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, אפשר להוסיף שדה בהתאמה אישית למסמכים של משתמשים ולאחזר את הערך של השדה הזה באמצעות קריאה מוטמעת בכללים. לכן, כלל שמבוסס על אדמין ייראה כמו בדוגמה הבאה:
Cloud 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;
}
}
אפשר לגשת לטענות בהתאמה אישית ב-Rules אחרי יצירת טענות בהתאמה אישית ב-Authentication. לאחר מכן תוכלו להפנות לטענות המותאמות אישית האלה באמצעות המשתנה auth.token
.
Cloud 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";
}
}
}
Realtime Database
{
"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"
}
}
}
Cloud Storage
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;
}
}
דוגמאות נוספות לשימוש בסיסי ב-Rules זמינות במאמר כללי אבטחה בסיסיים.Authentication