Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

กฎความปลอดภัยขั้นพื้นฐาน

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

กฎความปลอดภัยของ 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;
  }
}