กฎความปลอดภัยของ Firebase Realtime Database จะกำหนดว่าใครมีสิทธิ์อ่านและเขียนในฐานข้อมูล โครงสร้างข้อมูลของคุณเป็นอย่างไร และมีดัชนีใดบ้าง กฎเหล่านี้จะอยู่ในเซิร์ฟเวอร์ Firebase และจะบังคับใช้โดยอัตโนมัติตลอดเวลา คำขออ่าน และเขียนจะดำเนินการให้เสร็จสมบูรณ์ได้ก็ต่อเมื่อกฎของคุณอนุญาตเท่านั้น โดยค่าเริ่มต้น กฎของคุณจะไม่อนุญาตให้ใครเข้าถึงฐานข้อมูล ทั้งนี้เพื่อปกป้องฐานข้อมูลของคุณจากการละเมิดจนกว่าคุณจะมีเวลาปรับแต่งกฎหรือตั้งค่าการตรวจสอบสิทธิ์
กฎความปลอดภัยของ Realtime Database มีไวยากรณ์ที่คล้ายกับ JavaScript และมี 4 ประเภท ได้แก่
ประเภทของกฎ | |
---|---|
.read | อธิบายว่าผู้ใช้ได้รับอนุญาตให้อ่านข้อมูลหรือไม่และเมื่อใด |
.write | อธิบายว่าอนุญาตให้เขียนข้อมูลหรือไม่และเมื่อใด |
.validate | กำหนดลักษณะของค่าที่มีรูปแบบถูกต้อง มีแอตทริบิวต์ย่อยหรือไม่ และประเภทข้อมูล |
.indexOn | ระบุรายการย่อยที่จะจัดทำดัชนีเพื่อรองรับการจัดเรียงและการค้นหา |
Realtime Database ภาพรวมด้านความปลอดภัย
Firebase Realtime Database มีชุดเครื่องมือครบถ้วนสำหรับจัดการ ความปลอดภัยของแอป เครื่องมือเหล่านี้ช่วยให้คุณตรวจสอบสิทธิ์ผู้ใช้ บังคับใช้สิทธิ์ของผู้ใช้ และตรวจสอบอินพุตได้อย่างง่ายดาย
แอปที่ขับเคลื่อนโดย Firebase จะเรียกใช้โค้ดฝั่งไคลเอ็นต์มากกว่าแอปที่มีเทคโนโลยีอื่นๆ หลายอย่าง ดังนั้น วิธีที่เราใช้ในการรักษาความปลอดภัยอาจแตกต่างจากที่คุณคุ้นเคยอยู่บ้าง
การตรวจสอบสิทธิ์
ขั้นตอนแรกที่พบบ่อยในการรักษาความปลอดภัยของแอปคือ การระบุผู้ใช้ กระบวนการนี้เรียกว่าการตรวจสอบสิทธิ์ คุณใช้การตรวจสอบสิทธิ์ Firebase เพื่อให้ผู้ใช้ลงชื่อเข้าใช้แอปได้ การตรวจสอบสิทธิ์ Firebase รองรับวิธีการตรวจสอบสิทธิ์ทั่วไป เช่น Google และ Facebook รวมถึงการเข้าสู่ระบบด้วยอีเมลและรหัสผ่าน การเข้าสู่ระบบแบบไม่ระบุตัวตน และอื่นๆ
ตัวตนของผู้ใช้เป็นแนวคิดด้านความปลอดภัยที่สำคัญ ผู้ใช้แต่ละรายมีข้อมูลที่แตกต่างกัน และบางครั้งก็มีความสามารถที่แตกต่างกันด้วย ตัวอย่างเช่น ในแอปพลิเคชันแชท ข้อความแต่ละข้อความจะเชื่อมโยงกับผู้ใช้ที่สร้างข้อความนั้น ผู้ใช้ อาจลบข้อความของตนเองได้ แต่จะลบข้อความที่ผู้ใช้รายอื่นโพสต์ไม่ได้
การให้สิทธิ์
การระบุผู้ใช้เป็นเพียงส่วนหนึ่งของความปลอดภัย เมื่อทราบแล้วว่าผู้ใช้คือใคร คุณจะต้องมีวิธีควบคุมสิทธิ์เข้าถึงข้อมูลในฐานข้อมูล กฎความปลอดภัยของ Realtime Database
ช่วยให้คุณควบคุมการเข้าถึงของผู้ใช้แต่ละรายได้ ตัวอย่างเช่น นี่คือชุดกฎการรักษาความปลอดภัยที่อนุญาตให้ทุกคนอ่านเส้นทาง /foo/
แต่ไม่อนุญาตให้ใครเขียนไปยังเส้นทางดังกล่าว
{ "rules": { "foo": { ".read": true, ".write": false } } }
กฎ .read
และ .write
จะเรียงซ้อนกัน ดังนั้นชุดกฎนี้
จึงให้สิทธิ์อ่านข้อมูลที่เส้นทาง /foo/
รวมถึงเส้นทางที่ลึกลงไป
เช่น /foo/bar/baz
โปรดทราบว่ากฎ .read
และ
.write
ที่อยู่ในระดับตื้นกว่าในฐานข้อมูลจะลบล้างกฎที่อยู่ในระดับลึกกว่า ดังนั้น
สิทธิ์เข้าถึงแบบอ่านไปยัง /foo/bar/baz
จะยังคงได้รับในตัวอย่างนี้
แม้ว่ากฎที่เส้นทาง /foo/bar/baz
จะประเมินเป็นเท็จก็ตาม
กฎความปลอดภัยของ Realtime Database มี
ตัวแปรในตัว
และฟังก์ชันที่ช่วยให้คุณ
อ้างอิงถึงเส้นทางอื่นๆ การประทับเวลาฝั่งเซิร์ฟเวอร์ ข้อมูลการตรวจสอบสิทธิ์
และอื่นๆ ได้ ตัวอย่างกฎที่ให้สิทธิ์เข้าถึงระดับเขียนสำหรับผู้ใช้ที่ผ่านการรับรองความถูกต้องไปยัง /users/<uid>/
โดยที่ <uid> คือรหัสของผู้ใช้ที่ได้รับผ่าน Firebase Authentication
{ "rules": { "users": { "$uid": { ".write": "$uid === auth.uid" } } } }
การตรวจสอบข้อมูล
Firebase Realtime Database ไม่มีสคีมา ซึ่งช่วยให้คุณเปลี่ยนแปลงสิ่งต่างๆ ได้ง่ายขึ้น
ขณะพัฒนา แต่เมื่อแอปพร้อมที่จะเผยแพร่แล้ว ข้อมูลจะต้องสอดคล้องกัน
ภาษาของกฎมี.validate
กฎที่ช่วยให้คุณใช้ตรรกะการตรวจสอบได้โดยใช้การแสดงออกเดียวกันกับที่ใช้
สำหรับกฎ .read
และ .write
ความแตกต่างเพียงอย่างเดียวคือกฎการตรวจสอบไม่เรียงซ้อน ดังนั้นกฎการตรวจสอบที่เกี่ยวข้องทั้งหมดต้องประเมินเป็นจริงจึงจะอนุญาตให้เขียนได้
กฎเหล่านี้บังคับให้ข้อมูลที่เขียนไปยัง /foo/
ต้องเป็นสตริง
ที่มีอักขระน้อยกว่า 100 ตัว
{ "rules": { "foo": { ".validate": "newData.isString() && newData.val().length < 100" } } }
กฎการตรวจสอบมีสิทธิ์เข้าถึงฟังก์ชันและตัวแปรในตัวทั้งหมดเช่นเดียวกับกฎ .read
และ .write
คุณสามารถใช้
สิ่งเหล่านี้เพื่อสร้างกฎการตรวจสอบที่รับรู้ข้อมูลที่อื่นใน
ฐานข้อมูล ข้อมูลประจำตัวของผู้ใช้ เวลาของเซิร์ฟเวอร์ และอื่นๆ อีกมากมาย
การกำหนดดัชนีฐานข้อมูล
Firebase Realtime Database ช่วยให้คุณจัดเรียงและค้นหาข้อมูลได้ สำหรับข้อมูลขนาดเล็ก ฐานข้อมูลรองรับการค้นหาแบบเฉพาะกิจ ดังนั้นโดยทั่วไปจึงไม่จำเป็นต้องมีดัชนีระหว่างการพัฒนา อย่างไรก็ตาม ก่อนเปิดตัวแอป คุณควรระบุดัชนีสำหรับคำค้นหาใดๆ เพื่อให้มั่นใจว่าคำค้นหาจะยังคงทำงานได้เมื่อแอปเติบโตขึ้น
คุณระบุดัชนีได้โดยใช้กฎ .indexOn
ตัวอย่างการประกาศดัชนี
ที่จะจัดทำดัชนีฟิลด์ความสูงและความยาวสำหรับรายการ
ไดโนเสาร์มีดังนี้
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }
ขั้นตอนถัดไป
- เริ่มต้นใช้งานการวางแผนการพัฒนากฎสำหรับฐานข้อมูล
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการรักษาความปลอดภัยของข้อมูลโดยใช้กฎความปลอดภัย
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการระบุดัชนีโดยใช้กฎ