2016-09-28 6 views
0

質問は以下の拡張された発送枝についてです。どこでも認証されたユーザーだけがOWNのデータをどこにでも書くことができます。ただし、1つの例外があります。 ANY認証済みのユーザーかもしれません。のデータを読んでください。認証されたユーザによる古いデータの削除のみを許可するFirebaseルール

は、これまでのところ、私は何の問題もなかったが、ここ1つの、特殊なルールです:船のブランチタイムスタンプが10秒またはそれ以上の年齢であることを提供して

がANY認証されたユーザが任意のUIDの下に子を削除することができます。

私はすべてのユーザが呼び出すことができるようにしたい:

firebase.database().ref('/ships/gp3tJa3tgThukt39EejqJpZq12L2/granit').remove(); 

uid: gp3tJa3tgThukt39EejqJpZq12L2 

shipid: granit 

そしてだけ削除する権限を付与します。

は、レコードの年齢を確認するために、私は(このレコードが頻繁に更新されるので、私はここに、配列を使用していると私は最小限にデータを保存しておきたい)インデックス0perf配列にfirebase.database.ServerValue.TIMESTAMPを保存

クライアント側では、レコードが期限切れになる可能性が高く、その後は削除を呼び出すことができます。これは無駄な通話を避けるためです。

私は正しいルールを定義するためにいくつかの助けが必要です。問題の行は、このルールを定義しようとした2番目の例で強調表示されています。

{ 
    "ships": { 
     "EnBawzb0CjZVgAKrMZD4HE3k5rW2": { 
      "oasisoftheseas": { 
       "param": { 
        "scale": 0.33075936163570846, 
        "type": "cruise/royalcaribbean/oasisoftheseas" 
       }, 
       "perf": { 
        "0": 1, 
        "1": 1.11014724E7, 
        "2": 1.70473256E7, 
        "3": 115.7, 
        "timeStamp": 1475144447302 
       } 
      } 
     }, 
     "gp3tJa3tgThukt39EejqJpZq12L2": { 
      "granit": { 
       "param": { 
        "scale": 0.12235531736978282, 
        "type": "riverbarge/granit" 
       }, 
       "perf": { 
        "0": 5, 
        "1": 2.05622392E7, 
        "2": 13154087, 
        "3": 285.9, 
        "timeStamp": 1475144450086 
       } 
      } 
     } 
    } 
} 

以下のルール。私が正しく定義することに興味があるのは$ shipidの書き込みルールです。

{ 
    "rules": { 
    "anchors": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid === $uid" 
     } 
    }, 
    "completed": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid == $uid" 
     } 
    },  
    "ships": { 
     ".read": "auth !== null", 
     "$uid":{ 
     ".write": "auth.uid === $uid", 
     "$shipid":{ 
      ".write": "((auth !== null) && 
         (now - data.child('perf').child('timeStamp').val() >= 10000))" 
     } 
     } 
    }, 
    "shipslog": { 
     "$uid":{ 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid === $uid" 
     } 
    }  
    } 
} 
+0

あなたの質問にJSONツリーの画像が含まれています。 Firebaseデータベースコンソールの[エクスポート]ボタンをクリックすると、実際のJSONをテキストとして置き換えてください。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。ルールにも同じです。 –

+0

こんにちはフランク。画像をJSONデータに置き換えました。私はルールを更新し、私はそれが今働いていると思う。それでもあなたのフィードバックに感謝します。私はこの種の事がいつも起こる中間層がないので想像しています。私は絶対にfirebaseを愛しています。ちょうどそれを使用し始め、学習のほとんどの時間を過ごす。 –

+1

ヘイ・ポール。私はあなたのルールをテストデータベースにコピーし、シミュレータは削除操作を許可します( '/ ships/gp3tJa3tgThukt39EejqJpZq12L2/granit'に' null 'を書き込むことによってシミュレートします)。あなたがしようとしていることではありませんか? –

答えて

1

さて、私はフランク氏の確認のとおりに考え出しました。問題で編集された解決策は、正しい、安全で働きやすいものです。

"ships": { 
     ".read": "auth !== null", 
     "$uid":{ 
     ".write": "auth.uid === $uid", 
     "$shipid":{ 
      ".write": "((auth !== null) && 
         (now - data.child('perf').child('timeStamp').val() >= 10000))" 
     } 
     } 
    },... 

すべてのデータは、レコードの所有者によって発送枝に書き込まれます。より深いレベルでは、uidワイルドカードとshipidワイルドカードを使用して、期限切れになる可能性のあるデータにアクセスし、削除する必要があります。

タイムスタンプはサーバー側のサーバーによって提供されるので安全です。船を削除することは、認証されたすべてのユーザーによってのみ行われ、現在とタイムスタンプの差が10000ミリ秒を超えている場合に限ります。

これはおそらく、サーバアプリケーションのビジネスロジックを必要とせずに、クライアントアプリが古いデータをクリーンアップできるようにするクリーンな一般的な方法です。

関連する問題