กฎความปลอดภัยของ Firebase สำหรับข้อมูลอ้างอิง Cloud Storage

Firebase Security Rules สำหรับ Cloud Storage ใช้เพื่อกำหนดว่าผู้ใดมีสิทธิ์เข้าถึงการอ่านและเขียน ลงในไฟล์ที่จัดเก็บไว้ใน Cloud Storage รวมถึงวิธีจัดโครงสร้างไฟล์ด้วย และข้อมูลเมตาที่อยู่ในนั้น Cloud Storage Security Rules ประกอบด้วยกฎที่ พิจารณา request และ resource เพื่ออนุญาตหรือปฏิเสธการดำเนินการที่ต้องการ เช่น อัปโหลดไฟล์หรือเรียกข้อมูลเมตาของไฟล์ เอกสารอ้างอิงเหล่านี้ครอบคลุม ประเภทของกฎ คุณสมบัติของ request และ resource ข้อมูล ประเภทที่ Cloud Storage Security Rules ใช้และดูว่าข้อผิดพลาดเกิดขึ้นอย่างไร

กฎ

rule คือนิพจน์ที่ได้รับการประเมินเพื่อระบุว่า request เท่ากับหรือไม่ ได้รับอนุญาตให้ดำเนินการตามที่ต้องการ

ประเภท

อนุญาต

กฎ allow ข้อประกอบด้วยเมธอด เช่น read หรือ write และ เงื่อนไขที่ไม่บังคับ เมื่อมีการเรียกใช้กฎ ระบบจะประเมินเงื่อนไขดังกล่าว และ หากเงื่อนไขประเมินเป็น true ระบบจะอนุญาตวิธีที่ต้องการ หรือไม่เช่นนั้น เมธอดถูกปฏิเสธ กฎ allow ที่ไม่มีเงื่อนไขอนุญาตเสมอ วิธีการที่ต้องการ

// Always allow method
allow <method>;

// Allow method if condition is true
allow <method>: if <condition>;

ปัจจุบัน allow เป็นกฎประเภทเดียวที่รองรับ

เมธอดคำขอ

อ่าน

เมธอด read ครอบคลุมคำขอทั้งหมดที่มีการอ่านข้อมูลไฟล์หรือข้อมูลเมตา ซึ่งรวมถึงการดาวน์โหลดไฟล์และการอ่านข้อมูลเมตาของไฟล์

// Always allow reads
allow read;

// Allow reads if condition evaluates to true
allow read: if <condition>;

เขียน

เมธอด write จะครอบคลุมคำขอทั้งหมดที่มีการเขียนข้อมูลไฟล์หรือข้อมูลเมตา ซึ่งรวมถึงการอัปโหลดไฟล์ การลบไฟล์ และการอัปเดตข้อมูลเมตาของไฟล์

// Always allow writes
allow write;

// Allow writes if condition evaluates to true
allow write: if <condition>;

จับคู่

กฎจะทำงานเมื่อผู้ใช้ request (เช่น อัปโหลดหรือดาวน์โหลดไฟล์) ตรงกับเส้นทางไฟล์ที่กฎครอบคลุม match ประกอบด้วยเส้นทางและเนื้อความ ซึ่งต้องมีกฎ allow อย่างน้อย 1 ข้อ หากไม่มีเส้นทางที่ตรงกัน คำขอ ถูกปฏิเสธ

คุณสามารถmatchเส้นทางที่มีชื่อครบถ้วน หรือแทรกไวลด์การ์ดเพื่อจับคู่ทั้งหมดก็ได้ เส้นทางที่ตรงกับรูปแบบที่กำหนด

กลุ่มเส้นทาง

single_segment

คุณสามารถใช้กลุ่มเส้นทางเดียวเพื่อสร้างกฎที่ตรงกับไฟล์ที่จัดเก็บไว้ ใน Cloud Storage

// Allow read at "path" if condition evaluates to true
match /path {
  allow read: if <condition>;
}

นอกจากนี้ยังอนุญาตให้มีกลุ่มเส้นทางหลายส่วนและเส้นทางที่ซ้อนกันดังนี้

// Allow read at "path/to/object" if condition evaluates to true
match /path {
  match /to {
    match /object {
      allow read: if <condition>;
    }
  }
}

{single_segment_wildcard}

หากต้องการใช้กฎกับหลายไฟล์ในเส้นทางเดียวกัน คุณสามารถใช้ กลุ่มเส้นทางไวลด์การ์ดเพื่อจับคู่ไฟล์ทั้งหมดในเส้นทางหนึ่งๆ ตัวแปรไวลด์การ์ด มีการประกาศในเส้นทางโดยการรวมตัวแปรไว้ในวงเล็บปีกกา: {variable} ตัวแปรนี้เข้าถึงได้ภายในคำสั่งการจับคู่ในฐานะ string

// Allow read at any path "/*", if condition evaluates to true
match /{single_path} {
  // Matches "path", "to", or "object" but not "path/to/object"
  allow read: if <condition>;
}

กลุ่มเส้นทางหลายรายการและเส้นทางที่ซ้อนกันอาจมีไวลด์การ์ดได้ด้วย

// Allow read at any path "/path/*/newPath/*", if condition evaluates to true
match /path/{first_wildcard} {
  match /newPath/{second_wildcard} {
    // Matches "path/to/newPath/newObject" or "path/from/newPath/oldObject"
    allow read: if <condition>;
  }
}

{multi_segment_wildcard=**}

หากคุณต้องการจับคู่กลุ่มเส้นทางที่เท่ากับหรือต่ำกว่าเส้นทาง คุณสามารถใช้ ไวลด์การ์ดแบบหลายกลุ่ม ซึ่งจะจับคู่คำขอทั้งหมดกับและใต้ ตำแหน่งนั้น ซึ่งมีประโยชน์สำหรับการให้ข้อมูลรูปแบบอิสระแก่ผู้ใช้ พื้นที่เก็บข้อมูล หรือการสร้างกฎที่ตรงกับกลุ่มเส้นทางที่ต่างกันจำนวนมาก (เช่น เป็นการสร้างชุดไฟล์ที่อ่านได้แบบสาธารณะ หรือต้องมีการตรวจสอบสิทธิ์ การเขียนทั้งหมด)

มีการประกาศเส้นทางไวลด์การ์ดแบบหลายกลุ่มคล้ายกับกลุ่มเดียว ไวลด์การ์ดที่มีการเพิ่ม =** ต่อท้ายตัวแปร: {variable=**} ตัวแปรไวลด์การ์ดแบบหลายกลุ่มสามารถใช้ได้ภายในการจับคู่ เป็นออบเจ็กต์ path

// Allow read at any path "/**", if condition evaluates to true
match /{multi_path=**} {
  // Matches anything at or below this, from "path", "path/to", "path/to/object", ...
  allow read: if <condition>;
}

คำขอ

ตัวแปร request จะอยู่ในเงื่อนไขเพื่อแสดง มีขึ้นที่เส้นทางนั้น ตัวแปร request มีจำนวน ซึ่งสามารถใช้เพื่อตัดสินใจว่าจะอนุญาตคำขอที่เข้ามาใหม่หรือไม่

พร็อพเพอร์ตี้

auth

เมื่อผู้ใช้ที่ตรวจสอบสิทธิ์แล้วส่งคำขอกับ Cloud Storage ตัวแปร auth จะเติมด้วย uid (request.auth.uid) ของผู้ใช้เป็น รวมถึงคำกล่าวอ้างของ Firebase Authentication JWT (request.auth.token)

request.auth.token มีคีย์ต่อไปนี้บางส่วนหรือทั้งหมด

ช่อง คำอธิบาย
email อีเมลที่เชื่อมโยงกับบัญชี หากมี
email_verified true หากผู้ใช้ยืนยันแล้วว่ามีสิทธิ์เข้าถึงที่อยู่ email ผู้ให้บริการบางรายจะยืนยันอีเมลที่ตนเองเป็นเจ้าของโดยอัตโนมัติ
phone_number หมายเลขโทรศัพท์ที่เชื่อมโยงกับบัญชี หากมี
name ชื่อที่แสดงของผู้ใช้ หากตั้งค่าไว้
sub Firebase UID ของผู้ใช้ ชื่อนี้จะเป็นค่าที่ไม่ซ้ำกันภายในโปรเจ็กต์
firebase.identities พจนานุกรมของข้อมูลประจำตัวทั้งหมดที่เชื่อมโยงกับบัญชีของผู้ใช้นี้ คีย์ของพจนานุกรมสามารถเป็น email, phone, google.com, facebook.com, github.com, twitter.com ค่าของพจนานุกรมคืออาร์เรย์ของตัวระบุที่ไม่ซ้ำกันสำหรับผู้ให้บริการข้อมูลประจำตัวแต่ละรายที่เชื่อมโยงกับบัญชี เช่น auth.token.firebase.identities["google.com"][0] จะมีรหัสผู้ใช้ Google รหัสแรกที่เชื่อมโยงกับบัญชี
firebase.sign_in_provider ผู้ให้บริการการลงชื่อเข้าใช้ที่ใช้เพื่อรับโทเค็นนี้ อาจเป็นสตริงใดสตริงหนึ่งต่อไปนี้ custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com
firebase.tenant รหัสกลุ่มผู้ใช้ที่เชื่อมโยงกับบัญชี (หากมี) เช่น tenant2-m6tyz

หากใช้การตรวจสอบสิทธิ์ที่กำหนดเอง request.auth.token จะมีคอลัมน์ที่กำหนดเองด้วย การกล่าวอ้างที่นักพัฒนาซอฟต์แวร์ระบุ

เมื่อผู้ใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์ส่งคำขอ request.auth มีค่าเป็น null

// Allow requests from authenticated users
allow read, write: if request.auth != null;

path

ตัวแปร path มีเส้นทางที่กำลังดำเนินการ request เทียบกับ

// Allow a request if the first path segment equals "images"
allow read, write: if request.path[0] == 'images';

resource

ตัวแปร resource ประกอบด้วยข้อมูลเมตาของไฟล์ที่อัปโหลดหรือ ข้อมูลเมตาที่อัปเดตสำหรับไฟล์ที่มีอยู่ ซึ่งเกี่ยวข้องกับ resource ซึ่งมีข้อมูลเมตาของไฟล์ปัจจุบันอยู่ที่ เส้นทางที่ขอ ไม่ใช่ข้อมูลเมตาใหม่

// Allow a request if the new value is smaller than 5MB
allow read, write: if request.resource.size < 5 * 1024 * 1024;

request.resource มีพร็อพเพอร์ตี้ต่อไปนี้จาก resource

พร็อพเพอร์ตี้
name
bucket
metadata
size
contentType

time

ตัวแปร time มีการประทับเวลาที่แสดงถึงเวลาปัจจุบันของเซิร์ฟเวอร์ คำขอได้รับการประเมินที่ คุณใช้ตัวเลือกนี้เพื่อให้สิทธิ์เข้าถึงตามเวลาได้ ลงในไฟล์ เช่น อนุญาตให้อัปโหลดไฟล์จนถึงวันที่หนึ่งๆ เท่านั้น หรืออนุญาตให้อ่านไฟล์ได้สูงสุด 1 ชั่วโมงหลังจากอัปโหลด

// Allow a read if the file was created less than one hour ago
allow read: if request.time < resource.timeCreated + duration.value(1, 'h');

ฟังก์ชันหลายรายการมีไว้เพื่อเขียนกฎโดยใช้การประทับเวลา และ ระยะเวลา

ทรัพยากร

ตัวแปร resource มีข้อมูลเมตาของไฟล์สำหรับไฟล์ใน Cloud Storage เช่น ชื่อไฟล์ ขนาด เวลาที่สร้าง และ ข้อมูลเมตาที่กำหนดเอง

พร็อพเพอร์ตี้

name

สตริงที่มีชื่อเต็มของไฟล์ รวมถึงเส้นทางไปยังไฟล์

// Allow reads if the resource name is "path/to/object"
allow read: if resource.name == 'path/to/object'

bucket

สตริงที่มี Google Cloud Storage ที่เก็บข้อมูลที่ไฟล์นี้เก็บอยู่

// Allow reads of all resources in your bucket
allow read: if resource.bucket == '<your-cloud-storage-bucket>'

generation

int ที่มี Google Cloud Storage การสร้างออบเจ็กต์ของ ไฟล์ ใช้สำหรับกำหนดเวอร์ชันออบเจ็กต์

// Allow reads if the resource matches a known object version
allow read: if resource.generation == <known-generation>

metageneration

Int ที่มี Google Cloud Storage เมตาเจเนอเรชันของออบเจ็กต์ ของไฟล์ได้ ใช้สำหรับกำหนดเวอร์ชันออบเจ็กต์

// Allow reads if the resource matches a known object metadata version
allow read: if resource.metageneration == <known-generation>

size

Int ที่มีขนาดไฟล์ในหน่วยไบต์

// Allow reads if the resource is less than 10 MB
allow read: if resource.size < 10 * 1024 * 1024;

timeCreated

การประทับเวลาที่แสดงถึงเวลาที่สร้างไฟล์

// Allow reads if the resource was created less than an hour ago
allow read: if resource.timeCreated < request.time + duration.value(60, "m")

updated

การประทับเวลาที่บอกว่าไฟล์ได้รับการอัปเดตครั้งล่าสุดเมื่อใด

// Allow reads if the resource was updated less than an hour ago
allow read: if resource.updated < request.time + duration.value(60, "m")

md5Hash

สตริงที่มีแฮช MD5 ของ

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.md5Hash == resource.md5Hash;

crc32c

สตริงที่มีส่วน แฮช crc32c ของ

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.crc32c == resource.crc32c;

etag

สตริงที่มี etag ของ

// Allow writes if the etag matches a known object etag
allow write: if resource.etag == <known-generation>

contentDisposition

สตริงที่มีการจัดการเนื้อหาของไฟล์

// Allow reads if the content disposition matches a certain value
allow read: if resource.contentDisposition == 'inlined';

contentEncoding

สตริงที่มีการเข้ารหัสเนื้อหาของไฟล์

// Allow reads if the content is encoded with gzip
allow read: if resource.contentEncoding == 'gzip';

contentLanguage

สตริงที่มีภาษาเนื้อหาของไฟล์

// Allow reads if the content language is Japanese
allow read: if resource.contentLanguage == 'ja';

contentType

สตริงที่มีประเภทเนื้อหาของไฟล์

// Allow reads if the content type is PNG.
allow read: if resource.contentType == 'image/png';

metadata

Map<String, String> ที่มีข้อมูลเมตาเพิ่มเติมที่นักพัฒนาแอประบุไว้ ด้วย

// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.customProperty == 'customValue';

Firestore.get และfirestore.exists

ฟังก์ชัน firestore.get() และ firestore.exists() ช่วยให้คุณเข้าถึง เอกสารใน Cloud Firestore เพื่อประเมินเกณฑ์การให้สิทธิ์ที่ซับซ้อน

ทั้งฟังก์ชัน firestore.get() และ firestore.exists() ต้องการ เส้นทางเอกสารที่ระบุแบบเต็ม เมื่อใช้ตัวแปรเพื่อสร้างเส้นทางสำหรับ firestore.get() และ firestore.exists() คุณต้อง Escape อย่างชัดเจน โดยใช้ไวยากรณ์ $(variable)

Firestore.get

รับเนื้อหาของเอกสาร Cloud Firestore

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.uid)).data.memberships
    }
  }
}

Firestore.exists

ตรวจสอบว่ามีเอกสาร Cloud Firestore อยู่หรือไม่

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.uid))
    }
  }
}

บริการ

service เป็นการประกาศแรกในไฟล์ Cloud Storage Security Rules และ ระบุว่ากฎเหล่านี้จะมีผลกับบริการใด

ชื่อ

name

ระบบจะใช้ชื่อของกฎบริการ ค่าเดียวในปัจจุบันคือ firebase.storage

// Specify the service name
service firebase.storage {
  match /b/{bucket}/o {
    ...
  }
}

ประเภทข้อมูล

คุณตรวจสอบประเภทภาษา Rules ได้โดยใช้โอเปอเรเตอร์ is

// For example
a is null
a is string

null

ประเภทข้อมูล null แสดงถึงค่าที่ยังไม่มี

allow read: if request.auth != null;

bool

ประเภท bool แสดงค่าบูลีน true หรือ false

allow read: if true;   // always succeeds
allow write: if false; // always fails

การเปรียบเทียบ

คุณเปรียบเทียบค่าบูลีนได้โดยใช้โอเปอเรเตอร์ == !=

การดำเนินการบูลีน

การดำเนินการ นิพจน์
AND x && y
OR x || y
NOT !x

ไฟฟ้าลัดวงจรของการดำเนินการ ซึ่งจะส่งคืน true, false หรือ ข้อผิดพลาด

allow read: if true || false;   // always succeeds, short circuits at true
allow write: if false && true; // always fails, short circuits at false

int และ float

ประเภท int และ float แทนตัวเลข ตัดบอล: 0, 1, -2 ฯลฯ ขณะที่จำนวนลอยตัวคือ: 1.0, -2.0, 3.33 ฯลฯ

Ints คือค่า 64 บิตที่มีการลงนาม และแบบลอยเป็นค่าที่สอดคล้องกับ IEEE 754 แบบ 64 บิต ระบบจะเปลี่ยนค่าของประเภท int เป็น float เมื่อใช้ในการเปรียบเทียบและ การดำเนินการทางคณิตศาสตร์ที่มีค่า float

การเปรียบเทียบ

สามารถเปรียบเทียบและเรียงลำดับ Ints และ Float โดยใช้ ==, !=, >, < >= และ <= โอเปอเรเตอร์

เลขคณิต

คุณสามารถเพิ่ม ลบ คูณ หาร โมดูโล่ และปริพันธ์ ปฏิเสธ:

การดำเนินการ นิพจน์
การเพิ่ม x + y
การลบ x - y
การคูณ x * y
ดิวิชัน x / y
โมดูโล x % y
นิกาย -x

ฟังก์ชันทางคณิตศาสตร์

Firebase Security Rules สำหรับ Cloud Storage ยังมาพร้อมตัวช่วยด้านคณิตศาสตร์อีกมากมาย ฟังก์ชันที่จะลดความซับซ้อนของนิพจน์ ได้แก่

ฟังก์ชัน คำอธิบาย
math.ceil(x) เพดานของค่าตัวเลข
math.floor(x) ราคาพื้นของค่าตัวเลข
math.round(x) ปัดเศษค่าอินพุตให้เป็นจำนวนเต็มที่ใกล้ที่สุด
math.abs(x) ค่าสัมบูรณ์ของอินพุต
math.isInfinite(x) ทดสอบว่าค่านี้เป็น ±∞ หรือไม่ แล้วแสดงผล bool
math.isNaN(x) ทดสอบว่าค่าไม่ใช่ตัวเลข NaN แล้วแสดงผล bool

string

การเปรียบเทียบ

คุณสามารถเปรียบเทียบและเรียงลำดับสตริงต่างๆ แบบพจนานุกรมโดยใช้ ==, !=, >, <, >= และ <= โอเปอเรเตอร์

การเชื่อมต่อ

คุณสามารถต่อสตริงได้โดยใช้โอเปอเรเตอร์ +

// Concatenate a file name and extension
'file' + '.txt'

ดัชนีและช่วง

โอเปอเรเตอร์ index string[] จะแสดงสตริงที่มีอักขระ ในดัชนีที่ระบุไว้ในสตริง

// Allow reads of files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

โอเปอเรเตอร์ range string[i:j] จะแสดงสตริงที่มีฟิลด์ อักขระระหว่างดัชนีที่ระบุ ตั้งแต่ i (รวม) จนถึง j (ไม่รวม) หากไม่ได้ระบุ i หรือ j ค่าเหล่านี้จะมีค่าเริ่มต้นเป็น 0 และขนาด สตริงตามลำดับ แต่ต้องระบุอย่างน้อย i หรือ j เพื่อให้ช่วงถูกต้อง

// Allow reads of files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

โอเปอเรเตอร์ index และ range จะแสดงข้อผิดพลาดหากดัชนีที่ระบุ เกินขอบเขตของสตริง

size

แสดงจำนวนอักขระในสตริง

// Allow files with names less than 10 characters
match /{fileName} {
  allow write: if fileName.size() < 10;
}

matches

จับคู่นิพจน์ทั่วไป โดยแสดงผล true หากสตริงตรงกับฟังก์ชัน นิพจน์ทั่วไปที่กำหนด การใช้งาน ไวยากรณ์ Google RE2

// Allow writes to files which end in ".txt"
match /{fileName} {
  allow write: if fileName.matches('.*\\.txt')
}

split

แยกสตริงตามนิพจน์ทั่วไปที่ระบุและแสดงผล list จากสตริงทั้งหมด ใช้ไวยากรณ์ Google RE2

// Allow files named "file.*" to be uploaded
match /{fileName} {
  allow write: if fileName.split('.*\\..*')[0] == 'file'
}

path

เส้นทางเป็นชื่อที่คล้ายกับไดเรกทอรีและมีการจับคู่รูปแบบที่ไม่บังคับ การมีเครื่องหมายทับ / หมายถึงจุดเริ่มต้นของกลุ่มเส้นทาง

path

แปลงอาร์กิวเมนต์ string เป็น path

// Allow reads on a specific file path
match /{allFiles=**} {
  allow read: if allFiles == path('/path/to/file');
}

timestamp

การประทับเวลาอยู่ในเขตเวลา UTC โดยค่าที่เป็นไปได้เริ่มต้นที่ 0001-01-01T00.00.00Z และสิ้นสุดที่ 9999-12-31T23.59.59Z

การเปรียบเทียบ

คุณเปรียบเทียบและเรียงลำดับการประทับเวลาได้โดยใช้ ==, !=, >, <, >= และ <= โอเปอเรเตอร์

เลขคณิต

การประทับเวลารองรับการบวกและการลบระหว่างการประทับเวลาและระยะเวลาตาม ดังต่อไปนี้:

นิพจน์ ผลลัพธ์
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

date

ค่า timestamp ที่มี year, month และ day เท่านั้น

// Allow reads on the same day that the resource was created.
allow read: if request.time.date() == resource.timeCreated.date()

year

ค่าปีเป็นจำนวนเต็มตั้งแต่ 1 ถึง 9999

// Allow reads on all requests made before 2017
allow read: if request.time.year() < 2017

month

ค่าเดือนแบบจำนวนเต็มตั้งแต่ 1 ถึง 12

// Allow reads on all requests made during the month of January
allow read: if request.time.month() == 1;

day

วันที่ปัจจุบันของเดือนเป็น int ตั้งแต่ 1 ถึง 31

// Allow reads on all requests made during the first day of each month
allow read: if request.time.day() == 1;

time

ค่า duration ซึ่งมีเวลาปัจจุบัน

// Allow reads on all requests made before 12PM
allow read: if request.time.time() < duration.time(12, 0, 0, 0);

hours

ค่าชั่วโมงเป็น int ตั้งแต่ 0 ถึง 23

// Allow reads on all requests made before 12PM
allow read: if request.time.hours() < 12;

minutes

ค่านาทีเป็น int ตั้งแต่ 0 ถึง 59

// Allow reads during even minutes of every hour
allow read: if request.time.minutes() % 2 == 0;

seconds

ค่าวินาทีที่เป็นจำนวนเต็มตั้งแต่ 0 ถึง 59

// Allow reads during the second half of each minute
allow read: if request.time.seconds() > 29;

nanos

จำนวนวินาทีในเศษส่วนในนาโนเป็น int

// Allow reads during the first 0.1 seconds of each second
allow read: if request.time.nanos() < 100000000;

dayOfWeek

วันของสัปดาห์ ตั้งแต่ 1 (วันจันทร์) ถึง 7 (วันอาทิตย์)

// Allow reads on weekdays (Monday to Friday)
allow read: if request.time.dayOfWeek() < 6;

dayOfYear

วันของปีปัจจุบัน ตั้งแต่ 1 ถึง 366

// Allow reads every fourth day
allow read: if request.time.dayOfYear() % 4 == 0;

toMillis

แสดงผลจำนวนมิลลิวินาทีปัจจุบันนับตั้งแต่ Unix Epoch

// Allow reads if the request is made before a specified time
allow read: if request.time.toMillis() < <milliseconds>;

duration

ค่าระยะเวลาจะแสดงเป็นวินาทีบวกกับเศษส่วนใน นาโนวินาที

การเปรียบเทียบ

คุณเปรียบเทียบและเรียงลำดับระยะเวลาได้โดยใช้ ==, !=, >, <, >= และ <= โอเปอเรเตอร์

เลขคณิต

ระยะเวลารองรับการบวกและการลบระหว่างการประทับเวลาและระยะเวลาตาม ดังต่อไปนี้:

นิพจน์ ผลลัพธ์
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

seconds

จำนวนวินาทีในระยะเวลาปัจจุบัน ต้องอยู่ระหว่าง -315,576,000,000 และรวมอีกกว่า 315,576,000,000 คน

nanos

จำนวนวินาทีเป็นเศษส่วน (เป็นนาโนวินาที) ของระยะเวลาปัจจุบัน ต้อง ตั้งแต่ -999,999,999 และ +999,999,999 สำหรับจำนวนวินาทีที่ไม่ใช่ 0 และ นานอนวินาทีที่ไม่ใช่ 0 สัญลักษณ์ของทั้งสองค่านี้ต้องสอดคล้อง

duration.value

คุณสร้างระยะเวลาได้โดยใช้ duration.value(int magnitude, string units) ซึ่งจะสร้างระยะเวลาจากขนาดและหน่วยที่กำหนด

// All of these durations represent one hour:
duration.value(1, "h")
duration.value(60, "m")
duration.value(3600, "s")

unitที่เป็นไปได้มีดังนี้

ระยะเวลา unit
สัปดาห์ w
วัน d
ชั่วโมง h
นาที m
วินาที s
มิลลิวินาที ms
นาโนวินาที ns

duration.time

คุณสามารถสร้างระยะเวลาได้โดยใช้ duration.time(int hours, int minutes, int seconds, int nanoseconds) ฟังก์ชัน สร้างระยะเวลาเป็นชั่วโมง นาที วินาที และ นาโนวินาที

// Create a four hour, three minute, two second, one nanosecond duration
duration.time(4, 3, 2, 1)

list

รายการประกอบด้วยอาร์เรย์ค่าตามลำดับ ซึ่งมีประเภทเป็น null, bool, int, float, string, path, list, map, timestamp หรือ duration

ระบุ x และ y ประเภท list และ i และ j ของประเภท int

การสร้างวิดีโอ

หากต้องการสร้างรายการ ให้เพิ่มค่าระหว่างวงเล็บเหลี่ยมดังนี้

// Create a list of strings
['apples', 'grapes', 'bananas', 'cheese', 'goats']

การเปรียบเทียบ

คุณเปรียบเทียบรายการได้โดยใช้โอเปอเรเตอร์ == != ความเท่าเทียมกันของรายการ 2 รายการ ค่าทั้งหมดต้องเท่ากัน

ดัชนีและช่วง

โอเปอเรเตอร์ index list[] ส่งคืนสินค้าในดัชนีที่ระบุไว้ในดัชนี รายการ

// Allow reads of all files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

โอเปอเรเตอร์ range list[i:j] จะแสดงรายการทั้งหมดในรายการระหว่าง ดัชนีที่ระบุตั้งแต่ i (รวม) จนถึง j (ไม่รวม) หาก i หรือ j ไม่ได้ระบุไว้ จะมีค่าเริ่มต้นเป็น 0 และขนาดของรายการตามลำดับ ต้องระบุอย่างน้อย i หรือ j เพื่อให้ช่วงใช้งานได้

// Allow reads of all files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

in

แสดงผล true หากมีค่าที่ต้องการในรายการหรือ false หากไม่มี ปัจจุบัน

// Allow read if a filename has the string 'txt' in it
match /{fileName} {
  allow read: if 'txt' in fileName.split('\\.');
}

join

รวมรายการสตริงเป็นสตริงเดียวโดยคั่นด้วยสตริงที่กำหนด

// Allow reads if the joined array is 'file.txt'
allow read: if ['file', 'txt'].join('.') == 'file.txt';

size

จำนวนข้อมูลในรายการ

// Allow read if there are three items in our list
allow read: if ['foo', 'bar', 'baz'].size() == 3;

hasAll

แสดงผล true หากมีค่าทั้งหมดในรายการ

// Allow read if one list has all items in the other list
allow read: if ['file', 'txt'].hasAll(['file', 'txt']);

map

แผนที่มีคู่คีย์/ค่า คีย์เป็นสตริง และค่าอาจเป็นสตริงใดก็ได้ จาก: null, bool, int, float, string, path, list, map timestamp หรือ duration

การสร้างวิดีโอ

หากต้องการสร้างแผนที่ ให้เพิ่มคู่คีย์/ค่าระหว่างวงเล็บปีกกา ดังนี้

// Create a map of strings to strings
{
  'mercury': 'mars',
  'rain': 'cloud',
  'cats': 'dogs',
}

การเปรียบเทียบ

คุณสามารถเปรียบเทียบแผนที่ได้โดยใช้โอเปอเรเตอร์ == != ความเท่าเทียมกันของแผนที่ 2 ฉบับ คีย์ทั้งหมดต้องมีอยู่ทั้งในแผนที่และค่าทั้งหมดเท่ากัน

ดัชนี

ค่าในแผนที่เข้าถึงได้โดยใช้เครื่องหมายวงเล็บหรือเครื่องหมายจุด:

// Access custom metadata properties
allow read: if resource.metadata.property == 'property'
allow write: if resource.metadata['otherProperty'] == 'otherProperty'

หากไม่มีคีย์ ระบบจะแสดงผล error

in

แสดง true หากคีย์ที่ต้องการอยู่ในแผนที่ หรือ false หากไม่มี ปัจจุบัน

// Allow reads if a property is present in the custom metadata
allow read: if property in resource.metadata;

size

จำนวนคีย์ในแผนที่

// Allow reads if there's exactly one custom metadata key
allow read: if resource.metadata.size() == 1;

keys

รายการคีย์ทั้งหมดในแผนที่

// Allow reads if the first metadata key is 'myKey'
allow read: if resource.metadata.keys()[0] == 'myKey';

values

รายการค่าทั้งหมดในแผนที่ตามลำดับคีย์

// Allow reads if the first metadata value is 'myValue'
allow read: if resource.metadata.values()[0] == 'myValue';

ข้อผิดพลาด

การประเมินข้อผิดพลาด

Firebase Security Rules สำหรับ Cloud Storage จะทำการประเมินต่อไปเมื่อพบข้อผิดพลาด วิธีนี้มีประโยชน์เนื่องจากนิพจน์ && และ || แบบมีเงื่อนไขอาจดูดซับข้อผิดพลาด หากเงื่อนไขจะทำให้ไฟฟ้าลัดวงจรไปยัง false หรือ true ตามลำดับ ตัวอย่างเช่น

นิพจน์ ผลลัพธ์
error && true error
error && false false
error || true true
error || false error

กรณีทั่วไปที่ทำให้เกิดข้อผิดพลาด ได้แก่ การหารด้วย 0 การเข้าถึงค่า ในรายการหรือแผนที่ที่ไม่มีอยู่ และส่งค่าของประเภทที่ไม่ถูกต้อง ลงในฟังก์ชัน

// Error if resource.size is zero
allow read: if 1000000 / resource.size;

// Error, key doesn't exist
allow read: if resource.metadata.nonExistentKey == 'value';

// Error, no unit 'y' exists
allow read: if request.time < resource.timeCreated + duration.value(1, 'y');