Firestore Security Rules
boolean, bytes, duration, float, integer, latlng,
list
concat, hasAll, hasAny, hasOnly, join(separator), removeAll, size, toSet(setは、diff, intersection, unionがある)
string
lower, matches(re), replace(re, sub), split(re), trim, toUtf8(byte encodingする, urlとこかに使える?)
timestamp, duration,
debug
firestore
重要
pathを引数に取る
get, getAfter, exists, exsitesAfter
after???
request
.auth(uid, token)
tokenは、
email, email_verified, phone_number, name, sub(auth.uidと同じ?), firebase.identities(providerとの利用方法の違い?), firebase.sign_in_provider
method(get, list, create, update, delete)
path, query(limit, offset, orderBy)
resource
The new resource value, present on write requests only.
The firestore document being read or written.
よくわからない.
使い方
collection groupの場合,
拒否されて??となっていていたのは、
/grps/1/users/44/products/....という構造で、
queryが firebase.firestore().collectionGroup("products")......
で、securirty rulesで、 match /users/{path=**}/products/{prouductId} {allow read: if... }
としてして、rejectされていた。
queryがproductsなら、security rulesも、/{path=**}/products/{productsId}にしないと行けない。
では、で、whereの部分、field でガードを掛けるようにするのが正解?のよう。
ここを読むのが一番速い。
Cloud Firestore と Storage では Common Expression Language(CEL)のスーパーセットを利用し、match ステートメントと allow ステートメントに依存して、定義したパスのアクセスへの条件を設定します。
code:securityRule.cel
service <<name>> {
// Match the resource path.
match <<path>> {
// Allow the request if the following conditions are true.
allow <<methods>> : if <<condition>>
}
}
<<service>>名を指定して、<<path>>を指定して、許可するmethodsを指定(allowのみでdenyはない?), conditionがあれば、指定。
例:
serviceは、 cloud.firestore で固定
pathは、部分一致(前方一致かな)と完全一致がとれる。
完全一致の場合、ブロック内のルールが評価されます。部分一致の場合、ネストされた match ルールがテストされ
{variable}で変数としておいて、配下の{}で、その変数について再度match式(+ if)?が適用できる
{variable=**}とすると、/ で切らずに末尾のpathまで変数に取り、その配下でallow, match式(+if)を適用する。
function リテラルも使える。複雑なルールはfunctionでまとめる。
条件(ifのこと?)
presetの変数がある、request, resosurce. webのリクエストを解析するのと同じイメージ。
request.auth, request.method, request.params,
resourceは、サービスの現在の値と書いてあるが、、cloud.firestoreなら....
firestoreのdocumentの値とかかな。であれば、細かい制御は可能かな。
ここに正規表現の例がある。
とりあえず, service がcloud.firestoreで、特定path + domain限定
code:securityRule_domain.cel
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.token.email.matches('.*@mydomain.com') == true }
}
}
realtime databaseのreferenceと間違えていて、時間を消耗したので、それに注意。 urlにdatabaseが入ると(現時点では) realtime,
firestoreはurl上でpathを切ってない?