Firebase มีเครื่องมือหลายอย่างให้คุณใช้จัดการ Rules โดยแต่ละเครื่องมือ จะมีประโยชน์ในกรณีที่เฉพาะเจาะจง และแต่ละเครื่องมือจะใช้ API การจัดการกฎความปลอดภัยของ Firebase ที่แบ็กเอนด์เดียวกัน
ไม่ว่าเครื่องมือใดจะใช้เรียกใช้ API การจัดการ แต่ API การจัดการจะทำสิ่งต่อไปนี้
- ส่งผ่านแหล่งที่มาของกฎ: ชุดกฎ ซึ่งโดยปกติจะเป็นไฟล์โค้ดที่มีคำสั่ง Firebase Security Rules
- จัดเก็บแหล่งที่มาที่ส่งผ่านข้อมูลเป็นชุดกฎที่เปลี่ยนแปลงไม่ได้
- ติดตามการติดตั้งใช้งานกฎแต่ละชุดในรุ่น บริการที่เปิดใช้กฎความปลอดภัยของ Firebase จะค้นหาการเผยแพร่สำหรับโปรเจ็กต์เพื่อประเมินคำขอแต่ละรายการ สำหรับทรัพยากรที่ปลอดภัย
- มีความสามารถในการเรียกใช้การทดสอบไวยากรณ์และความหมายของชุดกฎ
ใช้ Firebase CLI
Firebase CLI ช่วยให้คุณ อัปโหลดแหล่งที่มาในเครื่องและติดตั้งใช้งานรุ่นได้ CLI Firebase Local Emulator Suite ช่วยให้คุณทำการทดสอบในเครื่องแบบเต็มรูปแบบของแหล่งที่มาได้
การใช้ CLI ช่วยให้คุณควบคุมเวอร์ชันของกฎได้ด้วยโค้ดแอปพลิเคชัน และทำให้คุณสามารถนำกฎไปใช้เป็นส่วนหนึ่งของกระบวนการนำไปใช้ที่มีอยู่ได้
สร้างไฟล์การกำหนดค่า
เมื่อกำหนดค่าโปรเจ็กต์ Firebase โดยใช้ Firebase CLI คุณจะสร้าง.rules
ไฟล์กำหนดค่าในไดเรกทอรีโปรเจ็กต์ ใช้คำสั่งต่อไปนี้
เพื่อเริ่มกำหนดค่าโปรเจ็กต์ Firebase
Cloud Firestore
// Set up Firestore in your project directory, creates a .rules file firebase init firestore
Realtime Database
// Set up Realtime Database in your project directory, creates a .rules file firebase init database
Cloud Storage
// Set up Storage in your project directory, creates a .rules file firebase init storage
แก้ไขและอัปเดตกฎ
แก้ไขแหล่งที่มาของกฎในไฟล์การกำหนดค่า .rules
โดยตรง
ตรวจสอบว่าการแก้ไขใดๆ ที่คุณทำใน Firebase CLI แสดงใน Firebase คอนโซล หรือคุณอัปเดตอย่างสม่ำเสมอโดยใช้ Firebase คอนโซลหรือ Firebase CLI มิฉะนั้น คุณอาจเขียนทับการอัปเดตที่ทำในFirebaseคอนโซล
ทดสอบการอัปเดต
Local Emulator Suite มีโปรแกรมจำลองสำหรับผลิตภัณฑ์ทั้งหมดที่เปิดใช้กฎความปลอดภัย เครื่องมือของกฎความปลอดภัยสำหรับแต่ละโปรแกรมจำลองจะทำการประเมินทั้งไวยากรณ์ และความหมายของกฎ จึงเหนือกว่าการทดสอบไวยากรณ์ที่ Security Rules Management API มีให้
หากคุณกำลังทำงานกับ CLI ชุดเครื่องมือนี้เป็นเครื่องมือที่ยอดเยี่ยมสำหรับFirebase Security Rules การทดสอบ ใช้ Local Emulator Suite เพื่อทดสอบการอัปเดตในเครื่องและยืนยันว่า Rules ของแอปแสดงลักษณะการทำงานที่คุณต้องการ
นำการอัปเดตไปใช้
เมื่ออัปเดตและทดสอบ Rules แล้ว ให้ติดตั้งใช้งานแหล่งที่มาใน การผลิต
สำหรับ Cloud Firestore Security Rules ให้เชื่อมโยงไฟล์ .rules
กับฐานข้อมูลเริ่มต้นและฐานข้อมูลที่มีชื่อเพิ่มเติมโดยตรวจสอบและอัปเดตไฟล์ firebase.json
ใช้คำสั่งต่อไปนี้เพื่อเลือกติดตั้งใช้งาน Rules เพียงอย่างเดียวหรือ ติดตั้งใช้งานเป็นส่วนหนึ่งของกระบวนการติดตั้งใช้งานปกติ
Cloud Firestore
// Deploy rules for all databases configured in your firebase.json firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>
Realtime Database
// Deploy your .rules file firebase deploy --only database
Cloud Storage
// Deploy your .rules file firebase deploy --only storage
ใช้คอนโซล Firebase
นอกจากนี้ คุณยังแก้ไขRules แหล่งที่มาและทำให้เป็นรุ่นจาก คอนโซล Firebase ได้ด้วย ระบบจะดำเนินการทดสอบไวยากรณ์ขณะที่คุณแก้ไขใน UI ของคอนโซล Firebase และการทดสอบความหมายจะพร้อมใช้งานโดยใช้ Rules Playground
แก้ไขและอัปเดตกฎ
- เปิดคอนโซล Firebase แล้วเลือกโปรเจ็กต์
- จากนั้นเลือก Realtime Database, Cloud Firestore หรือพื้นที่เก็บข้อมูลจาก การนำทางผลิตภัณฑ์ แล้วคลิกกฎเพื่อไปยัง โปรแกรมแก้ไข Rules
- แก้ไขกฎในเครื่องมือแก้ไขโดยตรง
ทดสอบการอัปเดต
นอกเหนือจากการทดสอบไวยากรณ์ใน UI ของโปรแกรมแก้ไขแล้ว คุณยังทดสอบลักษณะการทำงานเชิงความหมาย Rulesได้โดยใช้ทรัพยากรฐานข้อมูลและพื้นที่เก็บข้อมูลของโปรเจ็กต์ โดยตรงในFirebaseคอนโซลโดยใช้Rules Playground เปิดหน้าจอสนามเด็กเล่นของกฎ ในRulesเอดิเตอร์ แก้ไขการตั้งค่า แล้วคลิกเรียกใช้ มองหาข้อความยืนยันที่ด้านบนของเครื่องมือแก้ไข
นำการอัปเดตไปใช้
เมื่อพอใจกับการอัปเดตแล้ว ให้คลิกเผยแพร่
ใช้ Admin SDK
คุณใช้ Admin SDK สำหรับ Node.js ชุดกฎได้ สิทธิ์เข้าถึงแบบเป็นโปรแกรมนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- ใช้เครื่องมือ สคริปต์ แดชบอร์ด และไปป์ไลน์ CI/CD ที่กำหนดเองเพื่อจัดการกฎ
- จัดการกฎในโปรเจ็กต์ Firebase หลายโปรเจ็กต์ได้ง่ายขึ้น
เมื่ออัปเดตกฎแบบเป็นโปรแกรม สิ่งสำคัญคือต้องหลีกเลี่ยงการเปลี่ยนแปลงการควบคุมการเข้าถึงแอปโดยไม่ตั้งใจ เขียนAdmin SDKโค้ด โดยคำนึงถึงความปลอดภัยเป็นอันดับแรก โดยเฉพาะเมื่ออัปเดตหรือใช้กฎ
อีกสิ่งสำคัญที่ควรทราบคือFirebase Security Rulesจะใช้เวลาหลายนาทีในการเผยแพร่ให้เสร็จสมบูรณ์ เมื่อใช้ Admin SDK เพื่อติดตั้งใช้งาน กฎ โปรดหลีกเลี่ยงการแข่งขันที่แอปของคุณต้องพึ่งพากฎ ที่ยังติดตั้งใช้งานไม่เสร็จ หากกรณีการใช้งานของคุณต้องมีการอัปเดตกฎการควบคุมการเข้าถึงบ่อยๆ ให้ลองใช้โซลูชันที่ใช้ Cloud Firestore ซึ่งออกแบบมาเพื่อลดสภาวะการแข่งขันแม้จะมีการอัปเดตบ่อยก็ตาม
โปรดทราบขีดจำกัดต่อไปนี้ด้วย
- กฎต้องมีขนาดเล็กกว่า 256 KiB ของข้อความที่เข้ารหัส UTF-8 เมื่อทำการซีเรียลไลซ์
- โปรเจ็กต์มีชุดกฎที่ใช้งานได้ทั้งหมดได้สูงสุด 2,500 ชุด เมื่อถึงขีดจำกัดนี้แล้ว คุณต้องลบชุดกฎเก่าบางชุดออกก่อนจึงจะสร้างชุดกฎใหม่ได้
สร้างและติดตั้งใช้งานชุดกฎ Cloud Storage หรือ Cloud Firestore
เวิร์กโฟลว์ทั่วไปสำหรับการจัดการกฎความปลอดภัยด้วย Admin SDK อาจมีขั้นตอนที่แยกกัน 3 ขั้นตอน ดังนี้
- สร้างแหล่งที่มาของไฟล์กฎ (ไม่บังคับ)
- สร้างชุดกฎ
- เผยแพร่หรือติดตั้งใช้งานชุดกฎใหม่
SDK มีเมธอดในการรวมขั้นตอนเหล่านี้เป็นการเรียก API เดียวสำหรับกฎความปลอดภัยของ Cloud Storage และ Cloud Firestore เช่น
const source = `service cloud.firestore {
match /databases/{database}/documents {
match /carts/{cartID} {
allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
}
}
}`;
// Alternatively, load rules from a file
// const fs = require('fs');
// const source = fs.readFileSync('path/to/firestore.rules', 'utf8');
await admin.securityRules().releaseFirestoreRulesetFromSource(source);
รูปแบบเดียวกันนี้ใช้ได้กับกฎ Cloud Storage ที่มี releaseFirestoreRulesetFromSource()
หรือจะสร้างไฟล์กฎเป็นออบเจ็กต์ในหน่วยความจำ สร้าง ชุดกฎ และติดตั้งใช้งานชุดกฎแยกกันเพื่อให้ควบคุมเหตุการณ์เหล่านี้ได้ใกล้ชิดยิ่งขึ้นก็ได้ เช่น
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
อัปเดตกฎชุด Realtime Database
หากต้องการอัปเดตกฎชุด Realtime Database ด้วย Admin SDK ให้ใช้วิธีการ getRules()
และ
setRules()
ของ admin.database
คุณสามารถดึงข้อมูลชุดกฎในรูปแบบ JSON
หรือเป็นสตริงที่มีความคิดเห็นรวมอยู่ด้วย
วิธีอัปเดตกฎ
const source = `{
"rules": {
"scores": {
".indexOn": "score",
"$uid": {
".read": "$uid == auth.uid",
".write": "$uid == auth.uid"
}
}
}
}`;
await admin.database().setRules(source);
จัดการชุดกฎ
Admin SDK ช่วยให้คุณแสดงกฎที่มีอยู่ทั้งหมดด้วย admin.securityRules().listRulesetMetadata
เพื่อช่วยจัดการชุดกฎขนาดใหญ่ เช่น
const allRulesets = [];
let pageToken = null;
while (true) {
const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
allRulesets.push(...result.rulesets);
pageToken = result.nextPageToken;
if (!pageToken) {
break;
}
}
สำหรับการติดตั้งใช้งานขนาดใหญ่มากซึ่งมีชุดกฎถึงขีดจำกัด 2, 500 รายการเมื่อเวลาผ่านไป คุณสามารถ สร้างตรรกะเพื่อลบกฎที่เก่าที่สุดในรอบเวลาที่กำหนดได้ เช่น หากต้องการลบชุดกฎทั้งหมดที่ใช้งานมานานกว่า 30 วัน ให้ทำดังนี้
const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
const promises = [];
allRulesets.forEach((rs) => {
if (new Date(rs.createTime) < thirtyDays) {
promises.push(admin.securityRules().deleteRuleset(rs.name));
}
});
await Promise.all(promises);
console.log(`Deleted ${promises.length} rulesets.`);
ใช้ REST API
เครื่องมือที่อธิบายไว้ข้างต้นเหมาะกับเวิร์กโฟลว์ต่างๆ รวมถึง Firebase Security Rules การจัดการฐานข้อมูล Cloud Firestore หลายรายการในโปรเจ็กต์ของคุณ แต่คุณอาจต้องการจัดการและติดตั้งใช้งาน Firebase Security Rules โดยใช้ Management API เอง Management API ช่วยให้คุณมีความยืดหยุ่นมากที่สุด
โปรดทราบขีดจำกัดต่อไปนี้ด้วย
- กฎต้องมีขนาดเล็กกว่า 256 KiB ของข้อความที่เข้ารหัส UTF-8 เมื่อทำการซีเรียลไลซ์
- โปรเจ็กต์มีชุดกฎที่ใช้งานได้ทั้งหมดได้สูงสุด 2,500 ชุด เมื่อถึงขีดจำกัดนี้แล้ว คุณต้องลบชุดกฎเก่าบางชุดออกก่อนจึงจะสร้างชุดกฎใหม่ได้
สร้างและติดตั้งใช้งานชุดกฎ Cloud Firestore หรือ Cloud Storage ด้วย REST
ตัวอย่างในส่วนนี้ใช้ Firestore Rules แต่ก็ใช้กับ Cloud Storage Rules ได้เช่นกัน
นอกจากนี้ ตัวอย่างยังใช้ cURL เพื่อทำการเรียก API ด้วย เราจะข้ามขั้นตอนการตั้งค่าและส่งโทเค็นการตรวจสอบสิทธิ์ คุณทดลองใช้ API นี้ได้โดยใช้ โปรแกรมสำรวจ API ที่ผสานรวมกับ เอกสารอ้างอิง
ขั้นตอนทั่วไปในการสร้างและติดตั้งใช้งานชุดกฎโดยใช้ Management API มีดังนี้
- สร้างแหล่งที่มาของไฟล์กฎ
- สร้างชุดกฎ
- เผยแพร่ (ติดตั้งใช้งาน) ชุดกฎใหม่
สร้างแหล่งที่มา
สมมติว่าคุณกำลังทำงานในsecure_commerce
โปรเจ็กต์ Firebase และต้องการ
ติดตั้งใช้งาน Cloud Firestore Rules ที่ล็อกไว้กับฐานข้อมูลในโปรเจ็กต์
ชื่อ east_store
คุณใช้กฎเหล่านี้ได้ในไฟล์ firestore.rules
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
สร้างชุดกฎ
ตอนนี้ให้สร้างฟิงเกอร์ปรินต์ที่เข้ารหัส Base64 สำหรับไฟล์นี้ จากนั้นคุณจะใช้แหล่งที่มาในไฟล์นี้เพื่อสร้างเพย์โหลดที่จำเป็นในการสร้างชุดกฎด้วยprojects.rulesets.create
การเรียก REST ได้ ในที่นี้ ให้ใช้คำสั่ง cat
เพื่อแทรกเนื้อหาของ firestore.rules
ลงในเพย์โหลด REST
สำหรับการติดตาม หากต้องการเชื่อมโยงกับฐานข้อมูล east_store
ให้ตั้งค่า attachment_point
เป็น east_store
curl -X POST -d '{
"source": {
"files": [
{
"content": "' $(cat storage.rules) '",
"name": "firestore.rules",
"fingerprint": <sha fingerprint>
},
"attachment_point": "firestore.googleapis.com/databases/east_store"
]
}
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'
API จะแสดงการตอบกลับการตรวจสอบและความถูกต้องและชื่อชุดกฎ เช่น
projects/secure_commerce/rulesets/uuid123
เผยแพร่ (ติดตั้งใช้งาน) ชุดกฎ
หากชุดกฎถูกต้อง ขั้นตอนสุดท้ายคือการนำชุดกฎใหม่ไปใช้ในการเผยแพร่ที่มีชื่อ
curl -X POST -d '{
"name": "projects/secure_commerce/releases/cloud.firestore/east_store" ,
"rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'
โปรดทราบว่าการเผยแพร่ Firebase Security Rules จะใช้เวลาหลายนาทีจึงจะเผยแพร่ได้อย่างสมบูรณ์ เมื่อใช้ REST API การจัดการเพื่อติดตั้งใช้งาน ให้หลีกเลี่ยงการแข่งขัน ซึ่งแอปของคุณจะอิงตามกฎทันทีที่ยังติดตั้งใช้งานไม่เสร็จ
อัปเดตชุดกฎ Realtime Database ด้วย REST
Realtime Database มีอินเทอร์เฟซ REST ของตัวเองสําหรับการจัดการ Rules ดูการจัดการ Firebase Realtime Database Rules ผ่าน REST
จัดการชุดกฎด้วย REST
นอกเหนือจากเมธอด REST สำหรับการสร้างชุดกฎและการเผยแพร่แล้ว Management API ยังมีเมธอดต่อไปนี้เพื่อช่วยจัดการการติดตั้งใช้งานกฎจำนวนมาก
- แสดงรายการ รับ และลบชุดกฎ
- แสดงรายการ รับ และลบรุ่นของกฎ
สำหรับการติดตั้งใช้งานขนาดใหญ่มากซึ่งมีชุดกฎถึงขีดจำกัด 2, 500 รายการเมื่อเวลาผ่านไป คุณสามารถ
สร้างตรรกะเพื่อลบกฎที่เก่าที่สุดในรอบเวลาที่กำหนดได้ เช่น หากต้องการลบชุดกฎทั้งหมดที่ใช้งานมานานกว่า 30 วัน คุณสามารถเรียกใช้เมธอด projects.rulesets.list
แยกวิเคราะห์รายการ JSON ของออบเจ็กต์ Ruleset
ในคีย์ createTime
แล้วเรียกใช้ project.rulesets.delete
ในชุดกฎที่เกี่ยวข้องโดยใช้ ruleset_id
ทดสอบการอัปเดตด้วย REST
สุดท้ายนี้ Management API ช่วยให้คุณเรียกใช้การทดสอบไวยากรณ์และความหมายในทรัพยากร Cloud Firestore และ Cloud Storage ในโปรเจ็กต์ที่ใช้งานจริงได้
การทดสอบด้วยคอมโพเนนต์นี้ของ API ประกอบด้วย
- การกำหนดออบเจ็กต์ JSON
TestSuite
เพื่อแสดงชุดออบเจ็กต์TestCase
- การส่ง
TestSuite
- การแยกวิเคราะห์ออบเจ็กต์
TestResult
ที่ส่งคืน
มากำหนดTestSuite
ออบเจ็กต์ที่มีTestCase
รายการเดียวในไฟล์ testcase.json
กัน ในตัวอย่างนี้ เราจะส่งRules
แหล่งที่มาของภาษาแบบอินไลน์พร้อมกับเพย์โหลด REST ควบคู่ไปกับชุดทดสอบที่จะเรียกใช้
ในกฎเหล่านั้น เราระบุความคาดหวังในการประเมินกฎ และคำขอของไคลเอ็นต์
ที่จะใช้ทดสอบชุดกฎ นอกจากนี้ คุณยังระบุระดับความสมบูรณ์ของรายงานการทดสอบได้โดยใช้ค่า "FULL" เพื่อระบุผลลัพธ์สำหรับRulesนิพจน์ภาษาทั้งหมดที่ควรอยู่ในรายงาน รวมถึงนิพจน์ที่ไม่ตรงกับคำขอ
{ "source": { "files": [ { "name": "firestore.rules", "content": "service cloud.firestore { match /databases/{database}/documents { match /users/{userId}{ allow read: if (request.auth.uid == userId); } function doc(subpath) { return get(/databases/$(database)/documents/$(subpath)).data; } function isAccountOwner(accountId) { return request.auth.uid == accountId || doc(/users/$(request.auth.uid)).accountId == accountId; } match /licenses/{accountId} { allow read: if isAccountOwner(accountId); } } }" } ] }, "testSuite": { "testCases": [ { "expectation": "ALLOW", "request": { "auth": {"uid": "123"}, "path": "/databases/(default)/documents/licenses/abcd", "method": "get"}, "functionMocks": [ { "function": "get", "args": [{"exact_value": "/databases/(default)/documents/users/123"}], "result": {"value": {"data": {"accountId": "abcd"}}} } ] } ] } }
จากนั้นเราจะส่ง TestSuite
นี้เพื่อประเมินด้วยprojects.test
วิธี
curl -X POST -d '{
' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'
TestReport
ที่ส่งคืน (มีสถานะการทดสอบสําเร็จ/ไม่สําเร็จ รายการ
ข้อความแก้ไขข้อบกพร่อง รายการนิพจน์กฎที่เข้าชม และรายงานการประเมิน)
จะยืนยันด้วยสถานะสําเร็จว่ามีการอนุญาตการเข้าถึงอย่างถูกต้อง
จัดการสิทธิ์สำหรับ Cloud Storage Security Rules ข้ามบริการ
หากคุณสร้าง Cloud Storage Security Rules ที่ใช้เนื้อหาเอกสาร Cloud Firestore เพื่อประเมินเงื่อนไขด้านความปลอดภัย คุณจะได้รับข้อความแจ้งในคอนโซล Firebase หรือ CLI ของ Firebase เพื่อเปิดใช้ สิทธิ์ในการเชื่อมต่อผลิตภัณฑ์ทั้ง 2 รายการ
หากคุณตัดสินใจที่จะปิดใช้การรักษาความปลอดภัยข้ามบริการดังกล่าว ให้ทำดังนี้
ก่อนปิดใช้ฟีเจอร์นี้ ให้แก้ไขกฎโดยนำคำสั่งทั้งหมดที่ใช้ฟังก์ชัน Rules เพื่อเข้าถึง Cloud Firestore ออก ไม่เช่นนั้น หลังจากปิดใช้ฟีเจอร์แล้ว การประเมิน Rules จะทำให้คำขอพื้นที่เก็บข้อมูลของคุณไม่สำเร็จ
ใช้หน้า IAM ในคอนโซล Google Cloud เพื่อลบบทบาท "Firebase Rules Firestore Service Agent" โดยทำตามคำแนะนำของ Cloud สำหรับ การเพิกถอนบทบาท
ระบบจะแจ้งให้คุณเปิดใช้ฟีเจอร์อีกครั้งในครั้งถัดไปที่คุณบันทึกกฎข้ามบริการจาก Firebase CLI หรือคอนโซล Firebase