ทำความเข้าใจกฎฐานข้อมูลเรียลไทม์ของ Firebase

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

กฎการรักษาความปลอดภัยฐานข้อมูลแบบเรียลไทม์มีรูปแบบคล้าย JavaScript และมีสี่ประเภท:

ประเภทของกฎ
.อ่าน อธิบายว่าผู้ใช้อนุญาตให้อ่านข้อมูลหรือไม่และเมื่อใด
.เขียน อธิบายว่าข้อมูลสามารถเขียนได้หรือไม่และเมื่อใด
.validate กำหนดว่าค่าที่จัดรูปแบบอย่างถูกต้องจะมีลักษณะอย่างไร ไม่ว่าจะมีแอตทริบิวต์ย่อยและชนิดข้อมูลหรือไม่
.indexOn ระบุรายการย่อยที่จะจัดทำดัชนีเพื่อรองรับการสั่งซื้อและการสอบถาม

ภาพรวมความปลอดภัยของฐานข้อมูลเรียลไทม์

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

แอปที่ขับเคลื่อนโดย Firebase จะเรียกใช้โค้ดฝั่งไคลเอ็นต์มากกว่าแอปที่มีเทคโนโลยีอื่นๆ มากมาย ดังนั้น วิธีที่เราเข้าถึงการรักษาความปลอดภัยอาจแตกต่างไปจากที่คุณคุ้นเคยเล็กน้อย

การตรวจสอบสิทธิ์

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

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

การอนุญาต

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

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

.read และ .write กฎน้ำตกดังนั้นนี้ทุน ruleset อ่านการเข้าถึงข้อมูลใด ๆ ที่เส้นทาง /foo/ เช่นเดียวกับเส้นทางใด ๆ ลึกเช่น /foo/bar/baz โปรดทราบว่า .read และ .write กฎตื้นในฐานข้อมูลการแทนที่กฎลึกอ่านเพื่อการเข้าถึง /foo/bar/baz ยังจะได้รับในตัวอย่างนี้แม้ว่ากฎที่เส้นทาง /foo/bar/baz ประเมินเพื่อเท็จ

ฐานข้อมูลเรียลไทม์กฎการรักษาความปลอดภัยรวมถึง ตัวแปรในตัว และฟังก์ชั่นที่ช่วยให้คุณในการอ้างถึงเส้นทางอื่น ๆ timestamps ฝั่งเซิร์ฟเวอร์ข้อมูลการตรวจสอบและอื่น ๆ นี่คือตัวอย่างของกฎที่เขียนทุนการเข้าถึงสำหรับผู้ใช้สิทธิ์ไปยัง /users/<uid>/ ที่ <uid> เป็น ID ของผู้ใช้ที่ได้ผ่านการรับรองความถูกต้อง Firebase

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

การตรวจสอบข้อมูล

ฐานข้อมูลเรียลไทม์ของ Firebase ไม่มีสคีมา วิธีนี้ทำให้ง่ายต่อการเปลี่ยนแปลงสิ่งต่างๆ ในขณะที่คุณพัฒนา แต่เมื่อแอปของคุณพร้อมที่จะเผยแพร่ ข้อมูลจะต้องมีความสอดคล้องกันอยู่เสมอ ภาษากฎระเบียบรวมถึง .validate กฎซึ่งช่วยให้คุณใช้ตรรกะการตรวจสอบการใช้นิพจน์เดียวกับที่ใช้สำหรับ .read และ .write กฎ ความแตกต่างเพียงอย่างเดียวคือกฎการตรวจสอบไม่น้ำตกดังนั้นกฎการตรวจสอบที่เกี่ยวข้องทั้งหมดจะต้องประเมินให้เป็นจริงเพื่อให้การเขียนจะได้รับอนุญาต

กฎเหล่านี้บังคับใช้ข้อมูลที่เขียนไป /foo/ ต้องเป็นสตริงน้อยกว่า 100 ตัวอักษร:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

กฎการตรวจสอบมีการเข้าถึงทุกที่เหมือนกันในตัวฟังก์ชั่นและตัวแปรเป็น .read และ .write กฎ คุณสามารถใช้สิ่งเหล่านี้เพื่อสร้างกฎการตรวจสอบที่รับรู้ข้อมูลที่อื่นในฐานข้อมูลของคุณ ข้อมูลประจำตัวของผู้ใช้ เวลาเซิร์ฟเวอร์ และอื่นๆ

การกำหนดดัชนีฐานข้อมูล

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

ดัชนีมีการระบุโดยใช้ .indexOn กฎ นี่คือตัวอย่างการประกาศดัชนีที่จะจัดทำดัชนีฟิลด์ความสูงและความยาวสำหรับรายชื่อไดโนเสาร์:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

ขั้นตอนถัดไป