2016-12-09 21 views
0

2つの値が常にリアルタイムのDBに一緒に書き込まれるようにします。ファイヤーベースアトミック書き込み

私は、次のようなレイアウトがあります。

- > register_username

- - > uid_lookup

- - - > "some_username": "some_uid"

を - - > username_lookup

- "some_uid": "some_username"

これらは、(書式設定のため申し訳ありませんが)ルールです:私はそれが正常に動作します

{ 
    "uid_lookup": { 
    "username": "123" 
    }, 
    "username_lookup": { 
    "123":"username" 
    } 
} 

/register_username/に書き込む

// uid -> username && username -> uid 
"register_username": { 

    ".write":     "auth !== null", 
    ".validate":   "newData.hasChildren(['uid_lookup', 'username_lookup'])", 

    // username -> uid 
    "uid_lookup": { 

    "$username": { 
     ".validate": "newData.val() === auth.uid && !data.exists()" 
    } 

    }, 

    // uid -> username 
    "username_lookup": { 

    ".write":  "!data.exists()", 

    "$uid": { 
     ".validate": "auth.uid === $uid && newData.val().matches(/^[a-zA-Z0-9-_]{4,20}$/) && newData.parent().parent().child('uid_lookup/' + newData.val()).exists()" 
    } 

    }, 

    // don't allow any other children 
    "$other":    {".validate": false} 

} 

しかし、なぜエラーが発生することなく/register_username/uid_lookup/に書き込むことができますか?

+0

私はちょうど答えを書いていますが、今あなたがあなたの検証ルールについて質問しているかもしれないことを認識していることを認識してください。 :/ –

答えて

1

Firebaseデータベースセキュリティルールは、書き込み操作の前後にデータベースの状態を検証します。彼らはデルタを検証しません。

違法な書き込みをキャプチャしないでください。代わりに、法的なデータ構造だけを許可するようにルールを作成する必要があります。

/register_username/uid_lookupのデータの場合は、ユーザーが自分のuidのみを書き込むことができます。

"$username": { 
    ".validate": "newData.val() === auth.uid && !data.exists() && 
      newData.parent().parent().child('username_lookup').child(auth.uid).exists()" 
} 
+0

最後に私はこれを使用しなければなりませんでした: '' .validate ":"!data.exists()&& newData.val()=== auth.uid && newData.parent()。parent()。child ( 'username_lookup /' + auth.uid).exists() "' ありがとうございました! – stulleman

+1

さて、私はあなたがそこで欲しがった小切手を本当に確信していませんでした。私は私の答えを更新しました。 –

0

Permission cascades down in Firebase:ツリーの特定のレベルでユーザーに許可を与えた後は、低いレベルでそのアクセス許可を削除することはできません。任意の認証されたユーザが(そのノード自体を含む)/register_username下ですべてのデータを書き込むことができることを意味

".write": "auth !== null", 

あなたのルールは、AS /register_usernameの書き込みルールを定義で始まります。