2017-01-22 8 views
1

既存のものより古いタイムスタンプのデータの追加をブロックしたいと思います。サンプル・データベース:Firebaseデータベースセキュリティルールは、Javaコードではなく、シミュレータで動作します

{ 
    "latest" : { 
    "517" : { 
     "PARAM1" : { 
     "timestamp" : 11492, 
     "value" : 6593 
     } 
    } 
    } 
} 

Firebaseセキュリティルール:今すぐ

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 

    "latest": { 
     "$id": { 
      "$param": { 
       "timestamp": { ".validate": "newData.val() >= data.val()" } 
      } 
     } 
    } 
    } 
} 

、興味深い部分。シミュレータから別のデータを追加することを確認すると、期待どおりに動作します。 Smalerのタイムスタンプは拒否され、上位のものが追加されます。しかし、JavaコードからのSAMEデータの追加には影響しません。

拒否されるべきサンプルデータ:

/latest/517 
{ 
    "PARAM1" : { 
    "timestamp" : -5, 
    "value" : 643 
    } 
} 

Admin Database APIセクションで説明したように、私は純粋なJavaを使用com.google.firebase:firebase-admin:4.0.3を使用するには。

POJO:

public class TimeValue { 

    public long timestamp; 
    public double value; 

    public TimeValue(long timestamp, double value) { 
     super(); 
     this.timestamp = timestamp; 
     this.value = value; 
    } 

} 

挿入:

Map<String, TimeValue> timeValue = new HashMap<String, TimeValue>(); 
timeValue.put("PARAM1", new TimeValue(-5L, 643)); 

final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference idRef = database.getReference("latest/517"); 
idRef.setValue(timeValue); 

それがそのように動作するのはなぜ?それは意味をなさない。

答えて

2

あなたが管理者としてfirebaseを使用する場合、またはサービスアカウントとして、検証ルールがチェックされていない - あなただけのデータベースへの通常のアクセスが必要な場合は、まあ、あなたは管理者:)

だから、あなたは通常のアカウントとしてサインインできます。

管理者権限を持ちながら検証ルールをチェックしたい場合は、読み取り/書き込みルールを常に満たす特別なアカウントを使用するだけです。

  1. 使用databaseAuthVariableOverrideいくつかの特別な認証プロパティを設定するには:(これは当時の私の質問だったので、明らかに均等に安全な)私はそれを行うには2つの基本的な方法がありますが、あまりにもいくつかの時間前にこのつまずいた、私のquestionで説明これはルート.read/.writeのルールでチェックされ、サービスアカウントの場合はのみとなります。
  2. 特別なアカウント(通常の電子メール/パスワードでも)を作成し、同じルール(rootの.read/.write)でuid、電子メール、またはその他のプロパティをハードコードします。
+0

ありがとうございました!私はこれにあまりにも多くの時間を費やした;-)。 – androfan

関連する問題