Firebase Security Rules کنترل دسترسی و اعتبارسنجی داده ها را در قالبی ارائه می کند که از سطوح مختلف پیچیدگی پشتیبانی می کند. برای ساختن سیستمهای دسترسی مبتنی بر کاربر و نقشمحور که دادههای کاربران شما را ایمن نگه میدارد، Firebase Authentication با Firebase Security Rules استفاده کنید.
شناسایی کاربران
Authentication کاربرانی را که درخواست دسترسی به دادههای شما را دارند شناسایی میکند و این اطلاعات را به عنوان متغیری که میتوانید در قوانین خود اعمال کنید، ارائه میکند. متغیر auth
حاوی اطلاعات زیر است:
-
uid
: یک شناسه کاربری منحصر به فرد که به کاربر درخواست کننده اختصاص داده می شود. -
token
: نقشه ای از مقادیر جمع آوری شده توسط Authentication .
متغیر auth.token
حاوی مقادیر زیر است:
میدان | توضیحات |
---|---|
email | آدرس ایمیل مرتبط با حساب، در صورت وجود. |
email_verified | true اگر کاربر تأیید کرده باشد که به آدرس email دسترسی دارد. برخی از ارائه دهندگان به طور خودکار آدرس های ایمیل خود را تأیید می کنند. |
phone_number | شماره تلفن مرتبط با حساب، در صورت وجود. |
name | نام نمایشی کاربر، در صورت تنظیم. |
sub | UID 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;
}
}
پس از ایجاد ادعاهای سفارشی در Authentication ، میتوانید به ادعاهای سفارشی در Rules دسترسی داشته باشید. سپس می توانید با استفاده از متغیر 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 استفاده میکنند، به قوانین اساسی امنیت مراجعه کنید.