Google 致力于为黑人社区推动种族平等。查看具体举措
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

จัดการและปรับใช้กฎความปลอดภัยของ Firebase

ใช้ Firebase CLI

แก้ไขและปรับใช้กฎโดยใช้ Firebase CLI การใช้ CLI ช่วยให้คุณสามารถควบคุมกฎของคุณภายใต้การควบคุมเวอร์ชันด้วยรหัสแอปพลิเคชันของคุณและปรับใช้กฎเป็นส่วนหนึ่งของกระบวนการปรับใช้ที่มีอยู่ของคุณ

สร้างไฟล์คอนฟิกูเรชัน

เมื่อคุณกำหนดค่าโครงการ Firebase โดยใช้ Firebase CLI คุณจะสร้างไฟล์การกำหนดค่า. .rules ในไดเรกทอรีโครงการของคุณ ใช้คำสั่งต่อไปนี้เพื่อเริ่มกำหนดค่าโครงการ Firebase ของคุณ:

Cloud Firestore

// 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

ทดสอบการอัปเดตของคุณ

ใช้ โปรแกรมจำลอง Firebase เพื่อทดสอบการอัปเดตของคุณในเครื่องและยืนยันว่ากฎของแอปแสดงพฤติกรรมที่คุณต้องการ

ปรับใช้การอัปเดตของคุณ

เมื่อคุณอัปเดตและทดสอบกฎของคุณแล้วให้ปรับใช้กับการใช้งานจริง ใช้คำสั่งต่อไปนี้เพื่อเลือกปรับใช้กฎของคุณเพียงอย่างเดียวหรือปรับใช้เป็นส่วนหนึ่งของกระบวนการปรับใช้ตามปกติของคุณ

Cloud Firestore

// Deploy your .rules file
firebase deploy --only firestore:rules

ฐานข้อมูลเรียลไทม์

// Deploy your .rules file
firebase deploy --only database

การจัดเก็บเมฆ

// Deploy your .rules file
firebase deploy --only storage

ใช้คอนโซล Firebase

คุณยังแก้ไขและทำให้กฎใช้งานได้จากคอนโซล Firebase

แก้ไขและอัปเดตกฎของคุณ

  1. เปิด คอนโซล Firebase และเลือกโครงการของคุณ
  2. จากนั้นเลือก Realtime Database , Cloud Firestore หรือ Storage จากการนำทางของผลิตภัณฑ์จากนั้นคลิก กฎ เพื่อไปที่ตัวแก้ไขกฎ
  3. แก้ไขกฎของคุณโดยตรงในตัวแก้ไข

ทดสอบการอัปเดตของคุณ

คุณทดสอบพฤติกรรมกฎได้โดยตรงในคอนโซล Firebase โดยใช้ เครื่องมือจำลองกฎ เปิดหน้าจอ Simulator ในตัวแก้ไขกฎแก้ไขการตั้งค่าแล้วคลิก เรียกใช้ มองหาข้อความยืนยันที่ด้านบนของตัวแก้ไข

ปรับใช้การอัปเดตของคุณ

เมื่อคุณพอใจแล้วว่าการอัปเดตของคุณเป็นสิ่งที่คุณคาดหวังให้คลิก เผยแพร่

ใช้ Admin SDK

คุณสามารถใช้ Admin SDK สำหรับ Node.js เพื่อสร้างจัดการและปรับใช้กฎความปลอดภัยโดยใช้โปรแกรม ด้วยการเข้าถึงแบบเป็นโปรแกรมนี้คุณสามารถ:

  • ใช้เครื่องมือสคริปต์แดชบอร์ดและไปป์ไลน์ CI / CD ที่กำหนดเองสำหรับการจัดการกฎ
  • จัดการกฎได้ง่ายขึ้นในโครงการ Firebase หลายโครงการ

เมื่ออัปเดตกฎโดยใช้โปรแกรมสิ่งสำคัญอย่างยิ่งที่จะต้องหลีกเลี่ยงการเปลี่ยนแปลงการควบคุมการเข้าถึงสำหรับแอปของคุณโดยไม่ได้ตั้งใจ เขียนรหัส Admin SDK ของคุณโดยคำนึงถึงความปลอดภัยเป็นสำคัญโดยเฉพาะอย่างยิ่งเมื่ออัปเดตหรือปรับใช้กฎ

สิ่งสำคัญอีกประการที่ควรทราบก็คือกฎความปลอดภัยของ Firebase จะใช้เวลาหลายนาทีในการทำให้ใช้งานได้อย่างสมบูรณ์ เมื่อใช้ Admin SDK เพื่อปรับใช้กฎอย่าลืมหลีกเลี่ยงสภาวะการแข่งขันที่แอปของคุณต้องพึ่งพากฎที่การปรับใช้ยังไม่เสร็จสมบูรณ์ในทันที หากกรณีการใช้งานของคุณต้องการการอัปเดตกฎการควบคุมการเข้าถึงบ่อยๆให้พิจารณาวิธีแก้ปัญหาโดยใช้ Cloud Firestore ซึ่งออกแบบมาเพื่อลดเงื่อนไขการแข่งขันแม้จะมีการอัปเดตบ่อยครั้ง

โปรดทราบข้อ จำกัด เหล่านี้ด้วย:

  • กฎต้องมีขนาดเล็กกว่า 64 KiB ของข้อความที่เข้ารหัส UTF-8 เมื่อทำให้เป็นอนุกรม
  • โปรเจ็กต์สามารถมีชุดกฎที่ทำให้ใช้งานได้ทั้งหมดไม่เกิน 2,500 ชุด เมื่อถึงขีด จำกัด นี้คุณต้องลบชุดกฎเก่าบางชุดก่อนที่จะสร้างใหม่

สร้างและปรับใช้ชุดกฎ Cloud Storage หรือ Cloud Firestore

เวิร์กโฟลว์ทั่วไปสำหรับการจัดการกฎความปลอดภัยด้วย Admin SDK อาจมีสามขั้นตอนที่ไม่ต่อเนื่อง:

  1. สร้างไฟล์กฎ (ทางเลือก)
  2. สร้างชุดกฎ
  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);

อัปเดตชุดกฎฐานข้อมูลแบบเรียลไทม์

ในการอัปเดตชุดกฎฐานข้อมูลแบบเรียลไทม์ด้วย 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;
      }
    }

สำหรับชุดกฎขนาดใหญ่มากที่ถึงขีด จำกัด 2500 กฎเมื่อเวลาผ่านไปคุณสามารถสร้างตรรกะเพื่อลบกฎที่เก่าแก่ที่สุดในรอบเวลาที่กำหนด ตัวอย่างเช่นหากต้องการลบชุดกฎทั้งหมดที่ใช้งานนานกว่า 30 วัน:

    const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
    const promises = [];
    allRulesets.forEach((rs) => {
      if (new Date(rs.crateTime) < thirtyDays) {
        promises.push(admin.securityRules().deleteRuleset(rs.name));
      }
    });
    await Promise.all(promises);
    console.log(`Deleted ${promises.length} rulesets.`);