Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

กฎความปลอดภัยของ Firebase ช่วยให้คุณควบคุมการเข้าถึงข้อมูลที่เก็บไว้ได้ ไวยากรณ์กฎที่ยืดหยุ่นหมายความว่าคุณสามารถสร้างกฎที่ตรงกับอะไรก็ได้ ตั้งแต่การเขียนทั้งหมดไปยังฐานข้อมูลทั้งหมด ไปจนถึงการดำเนินการในเอกสารเฉพาะ

คู่มือนี้อธิบายกรณีการใช้งานพื้นฐานบางส่วนที่คุณอาจต้องการนำไปใช้เมื่อคุณตั้งค่าแอปและปกป้องข้อมูลของคุณ แต่ก่อนที่จะเริ่มต้นการเขียนกฎคุณอาจต้องการที่จะเรียนรู้เพิ่มเติมเกี่ยวกับ ภาษา ที่พวกเขากำลังเขียนในของพวกเขาและ พฤติกรรม

ในการเข้าถึงและการปรับปรุงกฎของคุณทำตามขั้นตอนที่ระบุไว้ใน การจัดการและการปรับใช้ Firebase กฎการรักษาความปลอดภัย

กฎเริ่มต้น: โหมดล็อก

เมื่อคุณสร้างเช่นฐานข้อมูลหรือจัดเก็บใน Firebase คอนโซลคุณเลือกไม่ว่าจะเป็น Firebase กฎของการรักษาความปลอดภัย จำกัด การเข้าถึงข้อมูลของคุณ (โหมดล็อค) หรืออนุญาตให้เข้าถึงทุกคน (โหมด Test) ในเมฆ FireStore และเรียลไทม์ฐานข้อมูลกฎเริ่มต้นสำหรับโหมดที่ถูกใส่กุญแจปฏิเสธการเข้าถึงผู้ใช้ทุกคน ใน 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;
    }
  }
}

กฎการผลิตพร้อม

ในขณะที่คุณเตรียมที่จะปรับใช้แอปของคุณ ตรวจสอบให้แน่ใจว่าข้อมูลของคุณได้รับการปกป้องและให้สิทธิ์การเข้าถึงแก่ผู้ใช้ของคุณอย่างเหมาะสม Leverage รับรองความถูกต้อง ในการตั้งค่าการเข้าถึงของผู้ใช้และอ่านได้โดยตรงจากฐานข้อมูลของคุณในการตั้งค่าข้อมูลการเข้าถึง

พิจารณาเขียนกฎในขณะที่คุณจัดโครงสร้างข้อมูล เนื่องจากวิธีที่คุณตั้งค่ากฎจะส่งผลต่อการจำกัดการเข้าถึงข้อมูลในเส้นทางต่างๆ

การเข้าถึงเฉพาะเจ้าของเนื้อหา

กฎเหล่านี้จำกัดการเข้าถึงเฉพาะเจ้าของเนื้อหาที่ผ่านการตรวจสอบสิทธิ์เท่านั้น ข้อมูลสามารถอ่านและเขียนได้โดยผู้ใช้คนเดียวเท่านั้น และเส้นทางข้อมูลมี ID ของผู้ใช้

เมื่อกฎนี้งาน: กฎนี้ทำงานได้ดีถ้าข้อมูลถูก siled โดยผู้ใช้ - ถ้าผู้ใช้เท่านั้นที่ตอบสนองความต้องการในการเข้าถึงข้อมูลเป็นผู้ใช้เดียวกันที่สร้างข้อมูล

เมื่อกฎนี้ไม่ได้ทำงาน: ruleset นี้ไม่ทำงานเมื่อผู้ใช้หลายคนต้องเขียนหรืออ่านข้อมูลเดียวกัน - ผู้ใช้จะเขียนทับข้อมูลหรือไม่สามารถที่จะเข้าถึงข้อมูลที่พวกเขาได้สร้างขึ้น

การตั้งค่ากฎนี้: สร้างกฎที่ยืนยันผู้ใช้ร้องขอการเข้าถึงในการอ่านหรือเขียนข้อมูลคือผู้ใช้ที่เป็นเจ้าของข้อมูลว่า

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

การเข้าถึงแบบสาธารณะและแบบส่วนตัว

กฎนี้อนุญาตให้ทุกคนอ่านชุดข้อมูล แต่จำกัดความสามารถในการสร้างหรือแก้ไขข้อมูลในเส้นทางที่กำหนดไปยังเจ้าของเนื้อหาที่ตรวจสอบสิทธิ์เท่านั้น

เมื่อกฎนี้ทำงาน: กฎนี้ทำงานได้ดีสำหรับปพลิเคชันที่จำเป็นต้องมีองค์ประกอบที่สามารถอ่านได้เปิดเผยต่อสาธารณชน แต่จำเป็นที่จะต้อง จำกัด สิทธิ์ในการแก้ไขเจ้าขององค์ประกอบเหล่านั้น ตัวอย่างเช่น แอพแชทหรือบล็อก

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

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

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

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

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

การตั้งค่ากฎนี้: ในเมฆ 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 แล้วใช้ประโยชน์จากการเรียกร้องในกฎระเบียบของคุณ

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