Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

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

กฎความปลอดภัยของ 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 ตรวจสอบคำขอกับข้อมูลจากฐานข้อมูลหรือข้อมูลเมตาของไฟล์เพื่อยืนยันหรือปฏิเสธการเข้าถึง

เมื่อกฎนี้ทำงาน: หากคุณกำลังกำหนดบทบาทให้กับผู้ใช้ กฎนี้จะทำให้ง่ายต่อการจำกัดการเข้าถึงตามบทบาทหรือกลุ่มผู้ใช้เฉพาะ ตัวอย่างเช่น หากคุณกำลังจัดเก็บคะแนน คุณสามารถกำหนดระดับการเข้าถึงต่างๆ ให้กับกลุ่ม "นักเรียน" (อ่านเนื้อหาเท่านั้น) กลุ่ม "ครู" (อ่านและเขียนในหัวเรื่อง) และกลุ่ม "อาจารย์ใหญ่" (อ่าน เนื้อหาทั้งหมด)

เมื่อกฎนี้ใช้ไม่ได้: ใน Realtime Database และ Cloud Storage กฎของคุณไม่สามารถใช้ประโยชน์จากเมธอด get() ที่กฎ Cloud Firestore สามารถรวมได้ ดังนั้น คุณต้องจัดโครงสร้างฐานข้อมูลหรือข้อมูลเมตาของไฟล์เพื่อแสดงแอตทริบิวต์ที่คุณใช้ในกฎของคุณ

ในการตั้งค่ากฎนี้: ใน Cloud Firestore ให้ใส่ฟิลด์ในเอกสารของผู้ใช้ที่คุณอ่านได้ จากนั้นจัดโครงสร้างกฎให้อ่านฟิลด์นั้นและให้สิทธิ์การเข้าถึงแบบมีเงื่อนไข ใน Realtime Database ให้สร้างเส้นทางข้อมูลที่กำหนดผู้ใช้แอปของคุณและมอบบทบาทในโหนดย่อย

คุณยังสามารถตั้งค่า การอ้างสิทธิ์ที่กำหนดเองในการตรวจสอบสิทธิ์ แล้วดึงข้อมูลนั้นจากตัวแปร auth.token ในกฎความปลอดภัยของ Firebase

คุณลักษณะและบทบาทที่กำหนดโดยข้อมูล

กฎเหล่านี้ใช้ได้เฉพาะใน Cloud Firestore และฐานข้อมูลเรียลไทม์

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 Authentication แล้วใช้ประโยชน์จากการอ้างสิทธิ์ในกฎของคุณ

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;
  }
}