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');