กฎความปลอดภัยของ Firebase ช่วยให้คุณควบคุมการเข้าถึงข้อมูลที่เก็บไว้ได้ ไวยากรณ์ของกฎที่ยืดหยุ่นหมายความว่าคุณสามารถสร้างกฎที่ตรงกับอะไรก็ได้ ตั้งแต่การเขียนทั้งหมดไปยังฐานข้อมูลทั้งหมด ไปจนถึงการดำเนินการในเอกสารเฉพาะ
คู่มือนี้จะอธิบายถึงกรณีการใช้งานพื้นฐานบางกรณีที่คุณอาจต้องการใช้เมื่อคุณตั้งค่าแอปและปกป้องข้อมูลของคุณ อย่างไรก็ตาม ก่อนที่คุณจะเริ่มเขียนกฎ คุณอาจต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ ภาษา ที่ใช้เขียนและ ลักษณะการทำงาน ของกฎ
หากต้องการเข้าถึงและอัปเดตกฎ ให้ทำตามขั้นตอนที่ระบุไว้ใน จัดการและปรับใช้กฎความปลอดภัยของ Firebase
กฎเริ่มต้น: โหมดล็อก
เมื่อคุณสร้างฐานข้อมูลหรืออินสแตนซ์พื้นที่เก็บข้อมูลในคอนโซล Firebase คุณจะต้องเลือกว่าจะให้กฎความปลอดภัยของ Firebase จำกัดการเข้าถึงข้อมูลของคุณ ( โหมดล็อก ) หรืออนุญาตให้ทุกคนเข้าถึง ( โหมดทดสอบ ) ใน Cloud Firestore และ Realtime Database กฎเริ่มต้นสำหรับ โหมดล็อก จะปฏิเสธการเข้าถึงของผู้ใช้ทั้งหมด ใน Cloud Storage เฉพาะผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์เท่านั้นที่สามารถเข้าถึงที่เก็บข้อมูลได้
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
ฐานข้อมูลเรียลไทม์
{
"rules": {
".read": false,
".write": false
}
}
การจัดเก็บเมฆ
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
กฎสภาพแวดล้อมการพัฒนา
ขณะที่คุณกำลังทำงานกับแอป คุณอาจต้องการเข้าถึงข้อมูลของคุณที่ค่อนข้างเปิดเผยหรือไม่ผูกมัด อย่าลืมอัปเดตกฎของคุณก่อนที่จะปรับใช้แอปของคุณกับการใช้งานจริง นอกจากนี้ โปรดจำไว้ว่าหากคุณปรับใช้แอป แอปจะสามารถเข้าถึงได้แบบสาธารณะ แม้ว่าคุณจะไม่ได้ เปิดใช้งาน ก็ตาม
โปรดจำไว้ว่า Firebase อนุญาตให้ไคลเอนต์เข้าถึงข้อมูลของคุณได้โดยตรง และกฎความปลอดภัยของ Firebase เป็นเพียงการป้องกันการบล็อกการเข้าถึงสำหรับผู้ใช้ที่ประสงค์ร้าย การกำหนดกฎแยกจากตรรกะของผลิตภัณฑ์มีข้อดีหลายประการ: ไคลเอนต์ไม่ต้องรับผิดชอบในการบังคับใช้ความปลอดภัย การใช้งานบั๊กกี้จะไม่ทำให้ข้อมูลของคุณเสียหาย และที่สำคัญที่สุดคือ คุณไม่ต้องพึ่งพาเซิร์ฟเวอร์ตัวกลางในการปกป้องข้อมูลจากทั่วโลก
ผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ทั้งหมด
แม้ว่าเราจะไม่แนะนำให้ผู้ใช้ที่ลงชื่อเข้าใช้เข้าถึงข้อมูลของคุณได้ แต่การตั้งค่าการเข้าถึงให้ผู้ใช้ที่ผ่านการรับรองความถูกต้องอาจมีประโยชน์ในขณะที่คุณกำลังพัฒนาแอป
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
ฐานข้อมูลเรียลไทม์
{
"rules": {
".read": "auth.uid !== null",
".write": "auth.uid !== null"
}
}
การจัดเก็บเมฆ
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
กฎพร้อมสำหรับการผลิต
ขณะที่คุณเตรียมปรับใช้แอป ตรวจสอบให้แน่ใจว่าข้อมูลของคุณได้รับการปกป้องและให้สิทธิ์การเข้าถึงแก่ผู้ใช้อย่างเหมาะสม ใช้ประโยชน์จาก การรับรองความถูกต้อง เพื่อตั้งค่าการเข้าถึงตามผู้ใช้ และอ่านโดยตรงจากฐานข้อมูลของคุณเพื่อตั้งค่าการเข้าถึงตามข้อมูล
พิจารณาการเขียนกฎในขณะที่คุณจัดโครงสร้างข้อมูล เนื่องจากวิธีที่คุณตั้งกฎจะส่งผลต่อวิธีที่คุณจำกัดการเข้าถึงข้อมูลในเส้นทางต่างๆ
เข้าถึงได้เฉพาะเจ้าของเนื้อหาเท่านั้น
กฎเหล่านี้จำกัดการเข้าถึงเฉพาะเจ้าของเนื้อหาที่ผ่านการตรวจสอบสิทธิ์เท่านั้น ข้อมูลสามารถอ่านและเขียนได้โดยผู้ใช้หนึ่งรายเท่านั้น และเส้นทางข้อมูลประกอบด้วย ID ของผู้ใช้
เมื่อกฎนี้ใช้ได้ผล: กฎนี้ใช้ได้ดีถ้าข้อมูลถูกเก็บโดยผู้ใช้ — ถ้าผู้ใช้คนเดียวที่ต้องเข้าถึงข้อมูลคือผู้ใช้คนเดียวกับที่สร้างข้อมูล
เมื่อกฎนี้ใช้ไม่ได้: ชุดกฎนี้ใช้ไม่ได้เมื่อผู้ใช้หลายคนจำเป็นต้องเขียนหรืออ่านข้อมูลเดียวกัน — ผู้ใช้จะเขียนทับข้อมูลหรือไม่สามารถเข้าถึงข้อมูลที่พวกเขาสร้างขึ้นได้
ในการตั้งค่ากฎนี้: สร้างกฎที่ยืนยันว่าผู้ใช้ที่ร้องขอการเข้าถึงเพื่ออ่านหรือเขียนข้อมูลคือผู้ใช้ที่เป็นเจ้าของข้อมูลนั้น
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Allow only authenticated content owners access
match /some_collection/{userId}/{documents=**} {
allow read, write: if request.auth != null && request.auth.uid == userId
}
}
}
ฐานข้อมูลเรียลไทม์
{
"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"
}
}
}
}
การจัดเก็บเมฆ
// Grants a user access to a node matching their user ID
service firebase.storage {
match /b/{bucket}/o {
// Files look like: "user/<UID>/path/to/file.txt"
match /user/{userId}/{allPaths=**} {
allow read, write: if request.auth != 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 read: if true
allow create: if request.auth.uid == request.resource.data.author_uid;
allow update, delete: if request.auth.uid == resource.data.author_uid;
}
}
}
ฐานข้อมูลเรียลไทม์
{
// 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"
}
}
}
}
การจัดเก็บเมฆ
service firebase.storage {
match /b/{bucket}/o {
// Files look like: "user/<UID>/path/to/file.txt"
match /user/{userId}/{allPaths=**} {
allow read;
allow write: if request.auth.uid == userId;
}
}
}
การเข้าถึงตามคุณสมบัติและตามบทบาท
เพื่อให้กฎเหล่านี้ทำงาน คุณต้องกำหนดและกำหนดแอตทริบิวต์ให้กับผู้ใช้ในข้อมูลของคุณ กฎความปลอดภัยของ Firebase ตรวจสอบคำขอกับข้อมูลจากฐานข้อมูลหรือข้อมูลเมตาของไฟล์เพื่อยืนยันหรือปฏิเสธการเข้าถึง
เมื่อกฎนี้ทำงาน: หากคุณกำลังกำหนดบทบาทให้กับผู้ใช้ กฎนี้ทำให้ง่ายต่อการจำกัดการเข้าถึงตามบทบาทหรือกลุ่มผู้ใช้เฉพาะ ตัวอย่างเช่น หากคุณจัดเก็บเกรด คุณสามารถกำหนดระดับการเข้าถึงต่างๆ ให้กับกลุ่ม "นักเรียน" (อ่านเนื้อหาเท่านั้น) กลุ่ม "ครู" (อ่านและเขียนในหัวข้อ) และกลุ่ม "อาจารย์ใหญ่" (อ่าน เนื้อหาทั้งหมด).
เมื่อกฎนี้ใช้ไม่ได้: ในฐานข้อมูลเรียลไทม์และ Cloud Storage กฎของคุณไม่สามารถใช้ประโยชน์จากเมธอด get()
ที่กฎของ Cloud Firestore สามารถรวมได้ ดังนั้น คุณต้องจัดโครงสร้างฐานข้อมูลหรือข้อมูลเมตาของไฟล์ให้สะท้อนถึงแอตทริบิวต์ที่คุณใช้ในกฎของคุณ
ในการตั้งค่ากฎนี้: ใน Cloud Firestore ให้ใส่ฟิลด์ในเอกสารของผู้ใช้ที่คุณอ่านได้ จากนั้นจัดโครงสร้างกฎของคุณเพื่ออ่านฟิลด์นั้นและให้สิทธิ์การเข้าถึงแบบมีเงื่อนไข ในฐานข้อมูลเรียลไทม์ ให้สร้างเส้นทางข้อมูลที่กำหนดผู้ใช้แอปของคุณและมอบบทบาทในโหนดลูก
คุณยังสามารถตั้ง ค่าการอ้างสิทธิ์แบบกำหนดเองในการรับรองความถูกต้อง จากนั้นดึงข้อมูลนั้นจากตัวแปร auth.token
ในกฎความปลอดภัยของ Firebase
คุณลักษณะและบทบาทที่กำหนดโดยข้อมูล
กฎเหล่านี้ใช้ได้เฉพาะใน 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"
}
}
}
ฐานข้อมูลเรียลไทม์
{
"rules": {
"some_path": {
"${subpath}": {
//
".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
".read": true
}
}
}
}
แอตทริบิวต์และบทบาทการอ้างสิทธิ์แบบกำหนดเอง
หากต้องการใช้กฎเหล่านี้ ให้ตั้งค่า การอ้างสิทธิ์ที่กำหนดเอง ในการตรวจสอบสิทธิ์ของ Firebase จากนั้นใช้ประโยชน์จากการอ้างสิทธิ์ในกฎของคุณ
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";
}
}
}
ฐานข้อมูลเรียลไทม์
{
"rules": {
"some_path": {
"$uid": {
// Create a custom claim for each role or group
// you want to leverage
".write": "auth.uid !== null && auth.token.writer === true",
".read": "auth.uid !== null && auth.token.reader === true"
}
}
}
}
การจัดเก็บเมฆ
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;
}
}
ฐานข้อมูลเรียลไทม์
{
"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
}
}
}
}
การจัดเก็บเมฆ
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;
}
}