Firebase มีเครื่องมือมากมายสำหรับจัดการกฎของคุณ โดยแต่ละอันมีประโยชน์ในบางกรณี และแต่ละอันใช้ API การจัดการกฎความปลอดภัย Firebase แบ็กเอนด์เดียวกัน
ไม่ว่าจะใช้เครื่องมือใดในการเรียกใช้ API การจัดการ:
- นำเข้า แหล่งที่มา ของกฎ : ชุดของกฎ ซึ่งโดยทั่วไปแล้วจะเป็นไฟล์โค้ดที่มีคำสั่งกฎความปลอดภัยของ Firebase
- จัดเก็บแหล่งที่มาที่นำเข้าเป็น ชุดกฎ ที่ไม่เปลี่ยนรูป
- ติดตามการปรับใช้ชุดกฎแต่ละชุดใน รุ่น บริการที่เปิดใช้งานกฎความปลอดภัย Firebase จะค้นหารุ่นสำหรับโปรเจ็กต์เพื่อประเมินแต่ละคำขอสำหรับทรัพยากรที่ปลอดภัย
- จัดเตรียมความสามารถในการรัน การทดสอบ วากยสัมพันธ์และความหมายของชุดกฎ
ใช้ Firebase CLI
ด้วย Firebase CLI คุณสามารถอัปโหลด แหล่งที่ มาในเครื่องและปรับใช้ รุ่นต่างๆ ได้ Firebase Local Emulator Suite ของ CLI ช่วยให้คุณสามารถทำการทดสอบ แหล่งที่ มาในเครื่องได้เต็มรูปแบบ
การใช้ CLI ช่วยให้คุณสามารถรักษากฎของคุณภายใต้การควบคุมเวอร์ชันด้วยโค้ดแอปพลิเคชันของคุณ และปรับใช้กฎต่างๆ โดยเป็นส่วนหนึ่งของกระบวนการปรับใช้ที่มีอยู่ของคุณ
สร้างไฟล์การกำหนดค่า
เมื่อคุณกำหนดค่าโปรเจ็กต์ Firebase โดยใช้ Firebase CLI คุณจะสร้างไฟล์การกำหนดค่า .rules
ในไดเร็กทอรีโปรเจ็กต์ของคุณ ใช้คำสั่งต่อไปนี้เพื่อเริ่มกำหนดค่าโปรเจ็กต์ Firebase ของคุณ:
คลาวด์ไฟร์สโตร์
// Set up Firestore in your project directory, creates a .rules file firebase init firestore
ฐานข้อมูลเรียลไทม์
// Set up Realtime Database in your project directory, creates a .rules file firebase init database
การจัดเก็บเมฆ
// 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 มีโปรแกรมจำลองสำหรับผลิตภัณฑ์ที่เปิดใช้งานกฎความปลอดภัยทั้งหมด กลไกกฎความปลอดภัยสำหรับโปรแกรมจำลองแต่ละตัวจะทำการประเมินกฎทั้งทางวากยสัมพันธ์และความหมาย ซึ่งถือว่าเหนือกว่าการทดสอบทางวากยสัมพันธ์ที่ API การจัดการกฎความปลอดภัยนำเสนอ
หากคุณทำงานกับ CLI Suite นี้เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการทดสอบกฎความปลอดภัยของ Firebase ใช้ Local Emulator Suite เพื่อทดสอบการอัปเดตของคุณในเครื่องและยืนยันว่ากฎของแอปแสดงพฤติกรรมที่คุณต้องการ
ปรับใช้การอัปเดตของคุณ
เมื่อคุณอัปเดตและทดสอบกฎของคุณแล้ว ให้ปรับใช้แหล่งที่มากับการใช้งานจริง
สำหรับกฎความปลอดภัยของ Cloud Firestore ให้เชื่อมโยงไฟล์ .rules
กับฐานข้อมูลเริ่มต้นและฐานข้อมูลที่มีชื่อเพิ่มเติมโดยการตรวจสอบและอัปเดต ไฟล์ firebase.json
ของคุณ
ใช้คำสั่งต่อไปนี้เพื่อเลือกปรับใช้กฎของคุณเพียงอย่างเดียวหรือปรับใช้เป็นส่วนหนึ่งของกระบวนการปรับใช้ปกติของคุณ
คลาวด์ไฟร์สโตร์
// 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>
ฐานข้อมูลเรียลไทม์
// Deploy your .rules file firebase deploy --only database
การจัดเก็บเมฆ
// Deploy your .rules file firebase deploy --only storage
ใช้คอนโซล Firebase
คุณยังสามารถแก้ไข แหล่งที่ มาของกฎและปรับใช้เป็น รุ่น จากคอนโซล Firebase การทดสอบ วากยสัมพันธ์จะดำเนินการเมื่อคุณแก้ไขใน UI คอนโซล Firebase และการทดสอบเชิงความหมายสามารถทำได้โดยใช้ Rules Playground
แก้ไขและอัปเดตกฎของคุณ
- เปิด คอนโซล Firebase และเลือกโปรเจ็กต์ของคุณ
- จากนั้นเลือก ฐานข้อมูลเรียลไทม์ , Cloud Firestore หรือ พื้นที่ จัดเก็บจากการนำทางผลิตภัณฑ์ จากนั้นคลิก กฎ เพื่อนำทางไปยังตัวแก้ไขกฎ
- แก้ไขกฎของคุณโดยตรงในตัวแก้ไข
ทดสอบการอัปเดตของคุณ
นอกเหนือจากการทดสอบไวยากรณ์ใน UI ตัวแก้ไขแล้ว คุณยังสามารถทดสอบการทำงานของกฎเชิงความหมายได้โดยตรงโดยใช้ฐานข้อมูลและทรัพยากรพื้นที่เก็บข้อมูลของโปรเจ็กต์ของคุณในคอนโซล Firebase โดยใช้ Rules Playground เปิดหน้าจอ Rules Playground ในตัวแก้ไขกฎ แก้ไขการตั้งค่าแล้วคลิก เรียกใช้ มองหาข้อความยืนยันที่ด้านบนของตัวแก้ไข
ปรับใช้การอัปเดตของคุณ
เมื่อคุณพอใจว่าการอัปเดตของคุณเป็นไปตามที่คุณคาดหวัง ให้คลิก เผยแพร่
ใช้ SDK ผู้ดูแลระบบ
คุณสามารถใช้ Admin SDK สำหรับ ชุดกฎ Node.js ได้ ด้วยการเข้าถึงแบบเป็นโปรแกรมนี้ คุณสามารถ:
- ใช้เครื่องมือ สคริปต์ แดชบอร์ด และไปป์ไลน์ CI/CD แบบกำหนดเองเพื่อการจัดการกฎ
- จัดการกฎได้ง่ายขึ้นในโปรเจ็กต์ Firebase หลายโปรเจ็กต์
เมื่ออัปเดตกฎโดยทางโปรแกรม สิ่งสำคัญมากคือต้องหลีกเลี่ยงการเปลี่ยนแปลงการควบคุมการเข้าถึงสำหรับแอปของคุณโดยไม่ได้ตั้งใจ เขียนโค้ด Admin SDK โดยคำนึงถึงความปลอดภัยเป็นสำคัญ โดยเฉพาะอย่างยิ่งเมื่ออัปเดตหรือปรับใช้กฎ
สิ่งสำคัญอีกประการหนึ่งที่ควรทราบก็คือการเผยแพร่กฎความปลอดภัยของ Firebase จะใช้เวลาหลายนาทีในการเผยแพร่อย่างสมบูรณ์ เมื่อใช้ Admin SDK เพื่อปรับใช้กฎ ตรวจสอบให้แน่ใจว่าได้หลีกเลี่ยงสภาวะการแข่งขันที่แอปของคุณต้องอาศัยกฎทันทีที่การปรับใช้งานยังไม่เสร็จสมบูรณ์ หากกรณีการใช้งานของคุณต้องการการอัปเดตกฎการควบคุมการเข้าถึงบ่อยครั้ง ให้พิจารณาโซลูชันโดยใช้ Cloud Firestore ซึ่งได้รับการออกแบบมาเพื่อลดสภาพการแข่งขันแม้ว่าจะอัปเดตบ่อยครั้งก็ตาม
โปรดทราบข้อจำกัดเหล่านี้ด้วย:
- กฎต้องมีขนาดเล็กกว่า 256 KiB ของข้อความที่เข้ารหัส UTF-8 เมื่อทำให้เป็นอนุกรม
- โปรเจ็กต์สามารถมีชุดกฎที่ใช้งานรวมได้สูงสุด 2,500 ชุด เมื่อถึงขีดจำกัดนี้ คุณต้องลบชุดกฎเก่าบางชุดก่อนสร้างชุดกฎใหม่
สร้างและปรับใช้ชุดกฎ Cloud Storage หรือ Cloud Firestore
ขั้นตอนการทำงานทั่วไปสำหรับการจัดการกฎความปลอดภัยด้วย Admin SDK อาจมีขั้นตอนแยกกันสามขั้นตอน:
- สร้างแหล่งที่มาของไฟล์กฎ (ไม่บังคับ)
- สร้างชุดกฎ
- ปล่อยหรือปรับใช้ชุดกฎใหม่
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);
อัปเดตชุดกฎฐานข้อมูลเรียลไทม์
หากต้องการอัปเดตชุดกฎฐานข้อมูลเรียลไทม์ด้วย 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 สำหรับฐานข้อมูล Cloud Firestore หลายฐานข้อมูลในโปรเจ็กต์ของคุณ แต่คุณอาจต้องการจัดการและปรับใช้กฎความปลอดภัยของ Firebase โดยใช้ API การจัดการเอง API การจัดการช่วยให้คุณมีความยืดหยุ่นสูงสุด
โปรดทราบข้อจำกัดเหล่านี้ด้วย:
- กฎต้องมีขนาดเล็กกว่า 256 KiB ของข้อความที่เข้ารหัส UTF-8 เมื่อทำให้เป็นอนุกรม
- โปรเจ็กต์สามารถมีชุดกฎที่ใช้งานรวมได้สูงสุด 2,500 ชุด เมื่อถึงขีดจำกัดนี้ คุณต้องลบชุดกฎเก่าบางชุดก่อนสร้างชุดกฎใหม่
สร้างและปรับใช้ชุดกฎ Cloud Firestore หรือ Cloud Storage ด้วย REST
ตัวอย่างในส่วนนี้ใช้กฎของ Firestore แม้ว่าจะใช้กับกฎ Cloud Storage ก็ตาม
ตัวอย่างยังใช้ cURL เพื่อทำการเรียก API ขั้นตอนในการตั้งค่าและส่งโทเค็นการตรวจสอบสิทธิ์จะถูกละเว้น คุณสามารถทดลองใช้ API นี้โดยใช้ API Explorer ที่ผสานรวมกับเอกสารอ้างอิง
ขั้นตอนทั่วไปสำหรับการสร้างและปรับใช้ชุดกฎโดยใช้ API การจัดการคือ:
- สร้างแหล่งไฟล์กฎ
- สร้างชุดกฎ
- ปล่อย (ปรับใช้) ชุดกฎใหม่
สร้างแหล่งที่มา
สมมติว่าคุณกำลังทำงานในโปรเจ็กต์ secure_commerce
Firebase และต้องการปรับใช้กฎ Cloud Firestore ที่ล็อคไว้กับฐานข้อมูลในโปรเจ็กต์ของคุณชื่อ 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 จะใช้เวลาหลายนาทีในการเผยแพร่อย่างสมบูรณ์ เมื่อใช้ REST API การจัดการในการปรับใช้ ตรวจสอบให้แน่ใจว่าได้หลีกเลี่ยงสภาวะการแข่งขันที่แอปของคุณต้องอาศัยกฎที่การปรับใช้งานยังไม่เสร็จสมบูรณ์ทันที
อัปเดตชุดกฎฐานข้อมูลเรียลไทม์ด้วย REST
ฐานข้อมูลเรียลไทม์มีอินเทอร์เฟซ REST ของตัวเองสำหรับการจัดการกฎ ดู การจัดการกฎฐานข้อมูลเรียลไทม์ Firebase ผ่าน REST
จัดการชุดกฎด้วย REST
เพื่อช่วยจัดการการปรับใช้กฎขนาดใหญ่ นอกเหนือจากวิธี REST สำหรับการสร้างชุดกฎและการเผยแพร่ API การจัดการยังจัดเตรียมวิธีการต่อไปนี้
- แสดงรายการ รับ และลบ ชุดกฎ
- แสดงรายการ รับ และลบ การเผยแพร่ กฎ
สำหรับการปรับใช้ขนาดใหญ่มากซึ่งถึงขีดจำกัดชุดกฎ 2,500 ชุดเมื่อเวลาผ่านไป คุณสามารถสร้างตรรกะเพื่อลบกฎที่เก่าที่สุดในรอบเวลาที่คงที่ได้ ตัวอย่างเช่น หากต้องการลบชุดกฎ ทั้งหมด ที่ใช้งานนานกว่า 30 วัน คุณสามารถเรียกใช้เมธอด projects.rulesets.list
แยกวิเคราะห์รายการ JSON ของออบเจ็กต์ชุด Ruleset
บนคีย์ createTime
จากนั้นเรียก project.rulesets.delete
บนชุดกฎที่เกี่ยวข้องโดย ruleset_id
.
ทดสอบการอัปเดตของคุณด้วย REST
สุดท้ายนี้ API การจัดการช่วยให้คุณสามารถเรียกใช้การทดสอบทางวากยสัมพันธ์และความหมายบนทรัพยากร Cloud Firestore และ Cloud Storage ในโปรเจ็กต์การผลิตของคุณ
การทดสอบกับส่วนประกอบของ API นี้ประกอบด้วย:
- การกำหนดออบเจ็กต์
TestSuite
JSON เพื่อแสดงชุดของออบเจ็กต์TestCase
- การส่ง
TestSuite
- การแยกวิเคราะห์วัตถุ
TestResult
ที่ส่งคืน
มากำหนดวัตถุ TestSuite
ด้วย TestCase
เดียวในไฟล์ testcase.json
ในตัวอย่างนี้ เราส่งซอร์สภาษา Rules ในบรรทัดพร้อมกับเพย์โหลด REST ควบคู่ไปกับชุดทดสอบเพื่อรันกฎเหล่านั้น เราระบุความคาดหวังในการประเมินกฎ และคำขอของลูกค้าที่จะทดสอบชุดกฎ คุณยังสามารถระบุความสมบูรณ์ของรายงานการทดสอบได้ โดยใช้ค่า "FULL" เพื่อระบุว่าผลลัพธ์สำหรับนิพจน์ภาษาของกฎทั้งหมดควรรวมอยู่ในรายงาน รวมถึงนิพจน์ที่ไม่ตรงกับคำขอด้วย
{ "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/FAILURE รายการข้อความแก้ไขข้อบกพร่อง รายการนิพจน์กฎที่เยี่ยมชม และรายงานการประเมิน) จะยืนยันด้วยสถานะ SUCCESS ว่าอนุญาตให้เข้าถึงได้อย่างถูกต้อง
จัดการสิทธิ์สำหรับกฎความปลอดภัย Cloud Storage ข้ามบริการ
หากคุณสร้างกฎความปลอดภัยของ Cloud Storage ที่ใช้ เนื้อหาเอกสาร Cloud Firestore เพื่อประเมินเงื่อนไขความปลอดภัย คุณจะได้รับแจ้งในคอนโซล Firebase หรือ Firebase CLI เพื่อเปิดใช้สิทธิ์ในการเชื่อมต่อผลิตภัณฑ์ทั้งสอง
หากคุณตัดสินใจที่จะปิดใช้งานการรักษาความปลอดภัยข้ามบริการดังกล่าว:
ขั้นแรก ก่อนที่จะปิดใช้งานคุณลักษณะนี้ ให้แก้ไขกฎของคุณ โดยลบคำสั่งทั้งหมดที่ใช้ฟังก์ชันกฎเพื่อเข้าถึง Cloud Firestore มิฉะนั้น หลังจากปิดใช้งานคุณสมบัตินี้แล้ว การประเมินกฎจะทำให้คำขอพื้นที่เก็บข้อมูลของคุณล้มเหลว
ใช้หน้า IAM ใน Google Cloud Console เพื่อลบบทบาท "Firebase Rules Firestore Service Agent" โดยทำตาม คำแนะนำของ Cloud สำหรับการเพิกถอนบทบาท
คุณจะได้รับแจ้งให้เปิดใช้งานคุณสมบัตินี้อีกครั้งในครั้งถัดไปที่คุณบันทึกกฎบริการข้ามจาก Firebase CLI หรือคอนโซล Firebase