Resional
99.99 %
Multi-Resion
99.999 %
SLO Designed to scale
We've designed Cloud
Firestore to handle the
toughest database
workloads from the world's
biggest apps.
世界最大のアプリからの最も厳しいデータベース
ワークロードを処理するように設計.
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read: if true;
allow write: if false;
}
}
}
ex) usersコレクションを読み取り専用にするルール
対象のコレクション
条件
許可する操作
function isAuthUser(auth, userId) {
return auth != null && auth.uid == userId
}
match /databases/{database}/documents {
match /users/{userId} {
allow read: if isAuthUser(request.auth, userId);
}
}
request.auth で認証情報を取得
Slide 34
Slide 34 text
スキーマ検証
Slide 35
Slide 35 text
ドキュメントは以下スキーマを持つ
RULE
カラム名 型
name String
sales Number
Slide 36
Slide 36 text
function isValidSchema(data) {
return data.size() == 2
&& 'name' in data && data.name is string
&& 'sales' in data && data.sales is number
}
match /databases/{database}/documents {
match /users/{userId} {
allow create: if
isValidSchema(request.resources.data);
}
}
request.resources.data で送信データを取得
function isValidData(data) {
return 'name' in data
&& 1 <= data.name.size() && data.name.size() <= 30
&& 'gender' in data
&& data.gender.matches('male|female|genderDiverse')
}
match /databases/{database}/documents {
match /users/{userId} {
allow create: if isValidData(request.resources.data);
}
}
関数 で送信データを判定
Slide 40
Slide 40 text
関連でのバリデーション
Slide 41
Slide 41 text
messagesはusersドキュメントの
ageが18以上の場合に追加できる
RULE
Slide 42
Slide 42 text
function isValidData(data) {
return
get(/databases/$(database)/documents/users/$(data.userRef))
.data.age >= 18
}
match /databases/{database}/documents {
match /messages/{message} {
allow create: if isValidData(request.resources.data);
}
}
get() で別ドキュメントのデータを参照
Slide 43
Slide 43 text
Firebase Authとの連携
Slide 44
Slide 44 text
admin 権限を持つユーザーのみ
投稿を許可する
RULE
Slide 45
Slide 45 text
function isAdminUser(auth) {
return auth.token.admin == true;
}
match /databases/{database}/documents {
match /users/{userId} {
allow create: if isAdminUser(request.auth);
}
}
custom claimsでadminを判定
Slide 46
Slide 46 text
パラメータの変化で判定
Slide 47
Slide 47 text
statusは`order`から`shipment`
の順で変化する
RULE
Slide 48
Slide 48 text
function isValidUpdate(oldData, newData) {
return oldData.status.matches('order')
&& newData.status.matches('shipment')
}
match /databases/{database}/documents {
match /users/{userId} {
allow update:
if isValidUpdate(resource.data, request.resources.data);
}
}
resource.data で
変更前のデータを取得して判定