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 Console แล้วเลือกโปรเจ็กต์
- จากนั้นเลือก Realtime Database, Cloud Firestore หรือพื้นที่เก็บข้อมูลจาก การนำทางผลิตภัณฑ์ แล้วคลิกกฎเพื่อไปยัง โปรแกรมแก้ไข Rules
- แก้ไขกฎในเครื่องมือแก้ไขโดยตรง
ทดสอบการอัปเดต
นอกเหนือจากการทดสอบไวยากรณ์ใน UI ของเอดิเตอร์แล้ว คุณยังทดสอบลักษณะการทำงานของ Semantic 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 ประกอบด้วย
- การกำหนดออบเจ็กต์
TestSuiteJSON เพื่อแสดงชุดออบเจ็กต์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ที่ส่งคืน (มีสถานะการทดสอบสําเร็จ/ไม่สําเร็จ รายการ
ข้อความแก้ไขข้อบกพร่อง รายการนิพจน์กฎที่เข้าชม และรายงานการประเมิน)
จะยืนยันด้วยสถานะ SUCCESS ว่ามีการอนุญาตการเข้าถึงอย่างถูกต้อง
จัดการสิทธิ์สำหรับ Cloud Storage Security Rules ข้ามบริการ
หากคุณสร้าง Cloud Storage Security Rules ที่ใช้เนื้อหาเอกสาร Cloud Firestore เพื่อประเมินเงื่อนไขด้านความปลอดภัย คุณจะได้รับข้อความแจ้งในคอนโซล Firebase หรือ CLI ของ Firebase เพื่อเปิดใช้ สิทธิ์ในการเชื่อมต่อผลิตภัณฑ์ทั้ง 2 รายการ
หากคุณตัดสินใจที่จะปิดใช้การรักษาความปลอดภัยข้ามบริการดังกล่าว ให้ทำดังนี้
ก่อนปิดใช้ฟีเจอร์นี้ ให้แก้ไขกฎโดยนำคำสั่งทั้งหมดที่ใช้ฟังก์ชัน Rules เพื่อเข้าถึง Cloud Firestore ออก ไม่เช่นนั้น หลังจากปิดใช้ฟีเจอร์แล้ว การประเมิน Rules จะทำให้คำขอพื้นที่เก็บข้อมูลของคุณไม่สำเร็จ
ใช้หน้า IAM ใน Google Cloud Console เพื่อลบบทบาท "Firebase Rules Firestore Service Agent" โดยทำตามคำแนะนำของ Cloud สำหรับ การเพิกถอนบทบาท
ระบบจะแจ้งให้คุณเปิดใช้ฟีเจอร์นี้อีกครั้งในครั้งถัดไปที่คุณบันทึกกฎข้ามบริการจาก Firebase CLI หรือคอนโซล Firebase