คู่มือนี้สร้างขึ้นจากคู่มือการกำหนดโครงสร้างกฎความปลอดภัย เพื่อแสดงวิธีเพิ่มเงื่อนไขในกฎความปลอดภัยของ Cloud Firestore หากคุณไม่ใช่ หากคุ้นเคยกับพื้นฐานของกฎความปลอดภัยของ Cloud Firestore โปรดดูการเริ่มต้นใช้งาน
องค์ประกอบที่ใช้สร้างสรรค์หลักของกฎความปลอดภัยของ Cloud Firestore คือเงื่อนไข ต คือนิพจน์บูลีนที่กำหนดว่าการดำเนินการหนึ่งๆ หรือไม่ ควรยอมรับหรือปฏิเสธ ใช้กฎความปลอดภัยเพื่อเขียนเงื่อนไขที่ ตรวจสอบการตรวจสอบสิทธิ์ผู้ใช้ ตรวจสอบข้อมูลขาเข้า หรือแม้กระทั่งเข้าถึงส่วนอื่นๆ ฐานข้อมูลของคุณ
การตรวจสอบสิทธิ์
รูปแบบหนึ่งของกฎความปลอดภัยที่ใช้กันมากที่สุดคือการควบคุมการเข้าถึงตาม สถานะการตรวจสอบสิทธิ์ของผู้ใช้ เช่น แอปของคุณอาจต้องการอนุญาตเฉพาะ ผู้ใช้ที่ลงชื่อเข้าใช้เพื่อเขียนข้อมูลได้
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to access documents in the "cities" collection
// only if they are authenticated.
match /cities/{city} {
allow read, write: if request.auth != null;
}
}
}
อีกรูปแบบหนึ่งที่พบได้บ่อยคือการตรวจสอบว่าผู้ใช้จะอ่านและเขียนได้เฉพาะข้อความของตนเอง ข้อมูล:
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, update, delete: if request.auth != null && request.auth.uid == userId;
allow create: if request.auth != null;
}
}
}
หากแอปใช้การตรวจสอบสิทธิ์ Firebase หรือ Google Cloud Identity Platform ตัวแปร request.auth
จะมี
ข้อมูลการตรวจสอบสิทธิ์สำหรับไคลเอ็นต์ที่ขอข้อมูล
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ request.auth
โปรดดูข้อมูลอ้างอิง
เอกสารประกอบ
การตรวจสอบข้อมูล
แอปจำนวนมากจัดเก็บข้อมูลการควบคุมการเข้าถึงเป็นช่องข้อมูลในเอกสารในฐานข้อมูล กฎความปลอดภัยของ Cloud Firestore สามารถอนุญาตหรือปฏิเสธการเข้าถึงแบบไดนามิกโดยอิงตามเอกสาร ข้อมูล:
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to read data if the document has the 'visibility'
// field set to 'public'
match /cities/{city} {
allow read: if resource.data.visibility == 'public';
}
}
}
ตัวแปร resource
คือเอกสารที่ขอ และ resource.data
คือ
แมปของฟิลด์และค่าทั้งหมดที่เก็บไว้ในเอกสาร สำหรับข้อมูลเพิ่มเติม
ข้อมูลเกี่ยวกับตัวแปร resource
โปรดดูข้อมูลอ้างอิง
เอกสารประกอบ
เมื่อเขียนข้อมูล คุณอาจต้องเปรียบเทียบข้อมูลขาเข้ากับข้อมูลที่มีอยู่
ในกรณีนี้ หากชุดกฎของคุณอนุญาตการเขียนที่รอดำเนินการ request.resource
จะมีสถานะในอนาคตของเอกสาร สำหรับการดำเนินการ update
ที่เพียง
แก้ไขส่วนย่อยของช่องเอกสาร ตัวแปร request.resource
จะ
มีสถานะเอกสารที่รอดำเนินการหลังการดำเนินการ คุณสามารถตรวจสอบช่อง
ค่าใน request.resource
เพื่อป้องกันการอัปเดตข้อมูลที่ไม่พึงประสงค์หรือไม่สอดคล้องกัน
service cloud.firestore {
match /databases/{database}/documents {
// Make sure all cities have a positive population and
// the name is not changed
match /cities/{city} {
allow update: if request.resource.data.population > 0
&& request.resource.data.name == resource.data.name;
}
}
}
เข้าถึงเอกสารอื่นๆ
เมื่อใช้ฟังก์ชัน get()
และ exists()
กฎความปลอดภัยจะสามารถประเมินได้
คำขอที่เข้ามากับเอกสารอื่นๆ ในฐานข้อมูล get()
และ
exists()
ทั้งคาดหวังเส้นทางเอกสารที่ระบุไว้อย่างสมบูรณ์ เมื่อใช้
เพื่อสร้างเส้นทางสำหรับ get()
และ exists()
คุณจะต้อง
Escape ตัวแปรโดยใช้ไวยากรณ์ $(variable)
ในตัวอย่างด้านล่าง การจับคู่จะจับตัวแปร database
match /databases/{database}/documents
และใช้เพื่อสร้างเส้นทาง:
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
// Make sure a 'users' document exists for the requesting user before
// allowing any writes to the 'cities' collection
allow create: if request.auth != null && exists(/databases/$(database)/documents/users/$(request.auth.uid));
// Allow the user to delete cities if their user document has the
// 'admin' field set to 'true'
allow delete: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
}
}
}
สำหรับการเขียน คุณสามารถใช้ฟังก์ชัน getAfter()
เพื่อเข้าถึงสถานะของไฟล์
เอกสารหลังการทำธุรกรรมหรือการเขียนเป็นชุดเสร็จสมบูรณ์ แต่ก่อน
ธุรกรรมหรือการดำเนินการแบบกลุ่ม เช่นเดียวกับ get()
ฟังก์ชัน getAfter()
จะใช้
เส้นทางเอกสารที่ระบุแบบเต็ม คุณใช้ getAfter()
เพื่อกำหนดชุดการเขียนได้
ที่ต้องเกิดขึ้นพร้อมกันเป็นธุรกรรมหรือกลุ่ม
เข้าถึงขีดจำกัดการโทร
มีการจำกัดการเรียกการเข้าถึงเอกสารต่อการประเมินชุดกฎ ดังนี้
- 10 สำหรับคำขอเอกสารและคำขอการค้นหารายการเดียว
-
20 สำหรับการอ่านเอกสาร ธุรกรรม และการเขียนเป็นกลุ่ม ขีดจำกัดก่อนหน้านี้ที่ 10 รายการมีผลกับแต่ละรายการ การดำเนินการ
ตัวอย่างเช่น สมมติว่าคุณสร้างคำขอการเขียนแบบกลุ่มที่มีการเขียน 3 ครั้ง และกฎความปลอดภัยของคุณใช้การเรียกการเข้าถึงเอกสาร 2 ครั้ง ตรวจสอบการเขียนแต่ละรายการ ในกรณีนี้ การเขียนแต่ละรายการจะใช้ การเรียกการเข้าถึง 10 ครั้งและคำขอเขียนเป็นกลุ่มใช้การเข้าถึง 6 จาก 20 ครั้ง
หากเกินขีดจำกัดใดขีดจำกัดจะทำให้เกิดข้อผิดพลาดเกี่ยวกับสิทธิ์ถูกปฏิเสธ เอกสารบางรายการ การเรียกการเข้าถึงอาจถูกแคชไว้ และการโทรที่แคชไว้จะไม่นับรวมในขีดจำกัด
หากต้องการดูคำอธิบายโดยละเอียดว่าขีดจำกัดเหล่านี้ส่งผลต่อธุรกรรมอย่างไร และ การเขียนแบบกลุ่ม ดูคู่มือสำหรับความปลอดภัยการดำเนินการระดับอะตอม
เข้าถึงการโทรและราคา
การใช้ฟังก์ชันเหล่านี้จะเรียกใช้การดำเนินการอ่านในฐานข้อมูลของคุณ ซึ่งหมายความว่าคุณจะถูกเรียกเก็บเงินสำหรับการอ่านเอกสารแม้ว่ากฎของคุณปฏิเสธ คำขอ ดูราคาของ Cloud Firestore สำหรับข้อมูลการเรียกเก็บเงินที่เฉพาะเจาะจงมากขึ้น
ฟังก์ชันที่กำหนดเอง
เนื่องจากกฎความปลอดภัยของคุณซับซ้อนมากขึ้น คุณอาจต้องรวมชุดของ ในฟังก์ชันที่คุณนำมาใช้ซ้ำในชุดกฎได้ กฎความปลอดภัย รองรับฟังก์ชันที่กำหนดเอง ไวยากรณ์สำหรับฟังก์ชันที่กำหนดเองจะคล้ายกับ JavaScript แต่ฟังก์ชันกฎความปลอดภัยจะเขียนในภาษาเฉพาะโดเมน ซึ่งมีข้อจำกัดสำคัญบางอย่าง
- ฟังก์ชันจะมีคำสั่ง
return
ได้เพียงคำสั่งเดียว จึงไม่สามารถ มีตรรกะเพิ่มเติม เช่น ไม่สามารถดำเนินการลูปหรือเรียก บริการภายนอก - ฟังก์ชันจะเข้าถึงฟังก์ชันและตัวแปรจากขอบเขตได้โดยอัตโนมัติ
ตามที่มีการกำหนดไว้ ตัวอย่างเช่น ฟังก์ชันที่กำหนดภายใน
ขอบเขต
service cloud.firestore
มีสิทธิ์เข้าถึงตัวแปรresource
และฟังก์ชันในตัว เช่นget()
และexists()
- ฟังก์ชันต่างๆ อาจเรียกใช้ฟังก์ชันอื่นๆ แต่อาจไม่แสดงใหม่ การโทรทั้งหมด จำกัดความลึกของสแต็กไว้ที่ 10
- ในกฎเวอร์ชัน
v2
ฟังก์ชันจะกำหนดตัวแปรโดยใช้คีย์เวิร์ดlet
ได้ ฟังก์ชันมีการเชื่อมโยง Let ๆ ได้สูงสุด 10 รายการ แต่ต้องสิ้นสุดด้วยการย้อนกลับ ข้อความ
ระบบจะกำหนดฟังก์ชันด้วยคีย์เวิร์ด function
และใช้เวลา 0 ขึ้นไป
อาร์กิวเมนต์ เช่น คุณอาจต้องการรวมเงื่อนไข 2 ประเภทที่ใช้รวมกัน
ในตัวอย่างข้างต้นให้เป็นฟังก์ชันเดียว
service cloud.firestore {
match /databases/{database}/documents {
// True if the user is signed in or the requested data is 'public'
function signedInOrPublic() {
return request.auth.uid != null || resource.data.visibility == 'public';
}
match /cities/{city} {
allow read, write: if signedInOrPublic();
}
match /users/{user} {
allow read, write: if signedInOrPublic();
}
}
}
การใช้ฟังก์ชันในกฎความปลอดภัยจะทำให้มีการบำรุงรักษายิ่งขึ้น ความซับซ้อนของกฎของคุณเพิ่มมากขึ้น
กฎไม่ใช่ตัวกรอง
เมื่อคุณรักษาความปลอดภัยของข้อมูลและเริ่มเขียนคำค้นหาแล้ว โปรดทราบว่า กฎไม่ใช่ตัวกรอง คุณไม่สามารถเขียนข้อความค้นหาสำหรับเอกสารทั้งหมดใน และคาดหวังให้ Cloud Firestore แสดงผลเฉพาะเอกสารที่ ไคลเอ็นต์ปัจจุบันมีสิทธิ์เข้าถึง
ตัวอย่างเช่น ให้ใช้กฎความปลอดภัยต่อไปนี้
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to read data if the document has the 'visibility'
// field set to 'public'
match /cities/{city} {
allow read: if resource.data.visibility == 'public';
}
}
}
ปฏิเสธ: กฎนี้ปฏิเสธคำค้นหาต่อไปนี้เนื่องจากชุดผลลัพธ์
สามารถรวมเอกสารที่ visibility
ไม่ใช่ public
:
เว็บ
db.collection("cities").get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); });
อนุญาต: กฎนี้อนุญาตการค้นหาต่อไปนี้เนื่องจากอนุประโยค where("visibility", "==", "public")
รับประกันว่าชุดผลลัพธ์เป็นไปตามเงื่อนไขของกฎ
เว็บ
db.collection("cities").where("visibility", "==", "public").get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); });
กฎความปลอดภัยของ Cloud Firestore จะประเมินการค้นหาแต่ละรายการตามศักยภาพ ผลลัพธ์และคำขอล้มเหลวในกรณีที่สามารถส่งคืนเอกสารที่ลูกค้าดำเนินการ ไม่มีสิทธิ์อ่าน การค้นหาต้องเป็นไปตามข้อจำกัดที่กำหนดโดย กฎความปลอดภัยของคุณ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกฎความปลอดภัยและคำถาม โปรดดูที่ การค้นหาข้อมูล
ขั้นตอนถัดไป
- ดูว่ากฎความปลอดภัยส่งผลต่อการค้นหาของคุณอย่างไร
- ดูวิธีจัดโครงสร้างกฎความปลอดภัย
- โปรดอ่านข้อมูลอ้างอิงกฎความปลอดภัย
- สำหรับแอปที่ใช้ Cloud Storage for Firebase โปรดดูวิธีเขียน เงื่อนไขของกฎความปลอดภัยของ Cloud Storage ที่เข้าถึงเอกสาร Cloud Firestore