2017-01-22 28 views
1

我想阻止添加比現有時間戳更早的時間戳數據。示例數據庫:Firebase數據庫安全規則適用於模擬器,不適用於java代碼

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

火力地堡安全規則:

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

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

現在,有趣的部分。當我檢查從模擬器添加不同的數據時 - 它按預期工作。 Smaler時間戳被拒絕,更高的被添加。但它不會對從Java代碼中添加相同數據產生任何影響。其應被拒絕

樣本數據:

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

我使用com.google.firebase:firebase-admin:4.0.3用純Java作爲在Admin Database API部分所述。

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

當您使用火力作爲管理員,或作爲服務帳戶,驗證規則不會檢查 - 因爲,你是管理員:)

如果你只是想給數據庫正常訪問,您只需以常規帳戶登錄即可。

如果你想擁有管理員權限,但仍希望檢查驗證規則,只需使用一個總是滿足讀/寫規則的「特殊」帳戶即可。我太前段時間偶然發現了這一點,有兩種基本的方式做到這一點,在我的question解釋(顯然同樣安全,因爲這是我的問題吧):

  1. 使用databaseAuthVariableOverride設置一些特殊的身份驗證屬性,這是在根.read/.write規則中檢查的,並且對於服務帳戶是真實的只有
  2. 創建一個特殊賬戶(即使是普通的電子郵件/密碼),並按照相同的規則(根目錄.read/.write)對其uid,電子郵件或其他屬性進行硬編碼。
+0

謝謝!我花了太多時間在這個;-)。 – androfan

相關問題