ক্লাউড স্টোরেজ রেফারেন্সের জন্য ফায়ারবেস নিরাপত্তা নিয়ম

ক্লাউড স্টোরেজের জন্য ফায়ারবেস সুরক্ষা নিয়মগুলি ক্লাউড স্টোরেজে সঞ্চিত ফাইলগুলিতে কে পড়ার এবং লেখার অ্যাক্সেস পেয়েছে, সেইসাথে ফাইলগুলি কীভাবে গঠন করা হয় এবং সেগুলিতে কী মেটাডেটা রয়েছে তা নির্ধারণ করতে ব্যবহৃত হয়। ক্লাউড স্টোরেজ সিকিউরিটি বিধিগুলি এমন নিয়মগুলির সমন্বয়ে গঠিত যেগুলি একটি কাঙ্খিত ক্রিয়াকলাপের অনুমতি বা অস্বীকার করার request এবং resource বিবেচনা করে, যেমন একটি ফাইল আপলোড করা বা ফাইল মেটাডেটা পুনরুদ্ধার করা৷ এই রেফারেন্স ডক্সগুলি নিয়মের প্রকার, একটি request বৈশিষ্ট্য এবং একটি resource , ক্লাউড স্টোরেজ সুরক্ষা নিয়ম দ্বারা ব্যবহৃত ডেটা প্রকারগুলি এবং কীভাবে ত্রুটিগুলি ঘটে তা কভার করে৷

নিয়ম

একটি 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 নিয়ম থাকতে হবে। যদি কোন পথ মেলে না, অনুরোধ প্রত্যাখ্যান করা হয়।

আপনি একটি সম্পূর্ণ নামের পাথের match পারেন, অথবা আপনি একটি নির্দিষ্ট প্যাটার্নের সাথে মানানসই সমস্ত পাথ মেলে ওয়াইল্ডকার্ড সন্নিবেশ করতে পারেন৷

পাথ সেগমেন্ট

single_segment

ক্লাউড স্টোরেজে সঞ্চিত একটি ফাইলের সাথে মেলে এমন একটি নিয়ম তৈরি করতে আপনি একক পাথ সেগমেন্ট ব্যবহার করতে পারেন।

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

যখন একজন প্রমাণীকৃত ব্যবহারকারী ক্লাউড স্টোরেজের বিরুদ্ধে একটি অনুরোধ করেন, তখন auth ভেরিয়েবলটি ব্যবহারকারীর uid ( request.auth.uid ) এর সাথে Firebase প্রমাণীকরণ 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 ভেরিয়েবলটিতে একটি টাইমস্ট্যাম্প রয়েছে যা বর্তমান সার্ভারের সময়কে প্রতিনিধিত্ব করে যে সময়ে একটি অনুরোধ মূল্যায়ন করা হচ্ছে। আপনি ফাইলগুলিতে সময়-ভিত্তিক অ্যাক্সেস প্রদান করতে এটি ব্যবহার করতে পারেন, যেমন: শুধুমাত্র একটি নির্দিষ্ট তারিখ পর্যন্ত ফাইলগুলি আপলোড করার অনুমতি দেওয়া, বা ফাইলগুলি আপলোড হওয়ার এক ঘন্টা পর্যন্ত পড়ার অনুমতি দেওয়া৷

// 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 ভেরিয়েবলে ক্লাউড স্টোরেজের ফাইলগুলির জন্য ফাইল মেটাডেটা থাকে, যেমন ফাইলের নাম, আকার, তৈরির সময় এবং কাস্টম মেটাডেটা।

বৈশিষ্ট্য

name

ফাইলের পাথ সহ ফাইলের পুরো নাম ধারণকারী একটি স্ট্রিং।

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

bucket

Google ক্লাউড স্টোরেজ বাকেট ধারণকারী একটি স্ট্রিং এই ফাইলটি সংরক্ষণ করা হয়েছে৷

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

generation

ফাইলের Google ক্লাউড স্টোরেজ অবজেক্ট জেনারেশন ধারণকারী একটি int। অবজেক্ট সংস্করণের জন্য ব্যবহৃত হয়।

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

metageneration

ফাইলটির Google ক্লাউড স্টোরেজ অবজেক্ট মেটাজেনারেশন ধারণকারী একটি int। অবজেক্ট সংস্করণের জন্য ব্যবহৃত হয়।

// 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() ফাংশনগুলি আপনাকে ক্লাউড ফায়ারস্টোরে নথিগুলি অ্যাক্সেস করার অনুমতি দেয় জটিল অনুমোদনের মানদণ্ডগুলি মূল্যায়ন করতে৷

firestore.get() এবং firestore.exists() ফাংশন উভয়ই সম্পূর্ণ-নির্দিষ্ট নথি পাথ আশা করে। firestore.get() এবং firestore.exists() এর জন্য পাথ তৈরি করার জন্য ভেরিয়েবল ব্যবহার করার সময়, আপনাকে $(variable) সিনট্যাক্স ব্যবহার করে স্পষ্টভাবে ভেরিয়েবল এড়িয়ে যেতে হবে।

firestore.get

একটি ক্লাউড ফায়ারস্টোর নথির বিষয়বস্তু পান।

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

একটি ক্লাউড ফায়ারস্টোর নথি বিদ্যমান কিনা তা পরীক্ষা করুন৷

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 একটি ক্লাউড স্টোরেজ সুরক্ষা নিয়ম ফাইলের প্রথম ঘোষণা, এবং এই নিয়মগুলি কোন পরিষেবাতে প্রযোজ্য হবে তা নির্দিষ্ট করে৷

নাম

name

সেবা বিধির নাম প্রযোজ্য হবে। একমাত্র বর্তমান মান হল firebase.storage

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

তথ্যের ধরণ

নিয়মের ভাষা আপনাকে 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 প্রকারগুলি সংখ্যার প্রতিনিধিত্ব করে। Ints হল: 0 , 1 , -2 , ইত্যাদি, যখন floats হল: 1.0 , -2.0 , 3.33 , ইত্যাদি।

Ints 64-বিট মান স্বাক্ষরিত, এবং floats হল 64-বিট IEEE 754 অনুগত মান। একটি float মান সহ তুলনা এবং গাণিতিক ক্রিয়াকলাপগুলিতে ব্যবহৃত হলে int এর মানগুলিকে float করতে বাধ্য করা হবে।

তুলনা

== , != , > , < , >= , এবং <= অপারেটর ব্যবহার করে Ints এবং floats তুলনা এবং অর্ডার করা যেতে পারে।

পাটিগণিত

Ints এবং floats যোগ করা যায়, বিয়োগ করা যায়, গুণ করা যায়, ভাগ করা যায়, moduloed এবং negated:

অপারেশন অভিব্যক্তি
যোগ x + y
বিয়োগ x - y
গুণ x * y
বিভাগ x / y
মডুলো x % y
নেগেশান -x

গাণিতিক ফাংশন

ক্লাউড স্টোরেজের জন্য ফায়ারবেস সুরক্ষা নিয়মগুলি অভিব্যক্তিকে সরল করার জন্য গণিতের সহায়ক ফাংশনগুলিও প্রদান করে:

ফাংশন বর্ণনা
math.ceil(x) সাংখ্যিক মানের সিলিং
math.floor(x) সাংখ্যিক মানের মেঝে
math.round(x) নিকটতম int ইনপুট মান বৃত্তাকার
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

int হিসাবে বছরের মান, 1 থেকে 9999 পর্যন্ত।

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

month

int হিসাবে মাসের মান, 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

একটি int হিসাবে সেকেন্ডের মান, 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

চলতি বছরের ১ থেকে ৩৬৬ তারিখ পর্যন্ত।

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

toMillis

ইউনিক্স যুগ থেকে মিলিসেকেন্ডের বর্তমান সংখ্যা প্রদান করে।

// 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 এর মধ্যে হতে হবে। অ-শূন্য সেকেন্ড এবং অ-শূন্য ন্যানোনসেকেন্ডের জন্য, উভয়ের চিহ্ন অবশ্যই একমত হতে হবে।

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 এবং টাইপ list y এবং টাইপ int এর i এবং j

সৃষ্টি

একটি তালিকা তৈরি করতে, বন্ধনীগুলির মধ্যে মান যুক্ত করুন:

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

তুলনা

== অপারেটর ব্যবহার করে তালিকা তুলনা করা যেতে পারে != । দুটি তালিকার সমতা সব মান সমান হতে হবে.

সূচক এবং পরিসীমা

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',
}

তুলনা

== অপারেটর ব্যবহার করে মানচিত্র তুলনা করা যেতে পারে != । দুটি মানচিত্রের সমতা প্রয়োজন সমস্ত কী উভয় মানচিত্রে উপস্থিত এবং সমস্ত মান সমান।

সূচক

একটি মানচিত্রের মানগুলি বন্ধনী বা ডট নোটেশন ব্যবহার করে অ্যাক্সেস করা হয়:

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

ত্রুটি

ত্রুটি মূল্যায়ন

ক্লাউড স্টোরেজের জন্য ফায়ারবেস নিরাপত্তা নিয়ম ত্রুটির সম্মুখীন হলে মূল্যায়ন চালিয়ে যায়। এটি দরকারী কারণ শর্তসাপেক্ষ && এবং || অভিব্যক্তি একটি ত্রুটি শোষণ করতে পারে যদি শর্তসাপেক্ষ অন্যথায় যথাক্রমে false বা true শর্ট-সার্কিট করে। এই ক্ষেত্রে:

অভিব্যক্তি ফলাফল
error && true error
error && false false
error || true true
error || false error

সাধারণ স্থান যেখানে ত্রুটি উত্থাপিত হয়: শূন্য দ্বারা বিভাজন, একটি তালিকা বা মানচিত্রের মানগুলি অ্যাক্সেস করা যা বিদ্যমান নেই এবং একটি ফাংশনে ভুল ধরণের মান পাস করা৷

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