Google 致力于为黑人社区推动种族平等。查看具体举措
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

คุณยังสามารถตั้งค่าการ อ้างสิทธิ์ที่กำหนดเองในการตรวจสอบสิทธิ์ แล้วดึงข้อมูลนั้นจากตัวแปร 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

โปรดจำไว้ว่าเมื่อใดก็ตามที่กฎของคุณมีการอ่านเช่นกฎด้านล่างคุณจะถูกเรียกเก็บเงินสำหรับการดำเนินการอ่านใน 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;
  }
}