2017-01-22 1 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 코드에서 SAME 데이터를 추가해도 아무런 영향을주지 않습니다. 거부해야

샘플 데이터 : Admin Database API 절에 설명 된대로

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

나는 순수 자바로 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

admin으로 중포 기지를 사용하는 경우, 또는 서비스 계정으로 유효성 검사 규칙이 확인하지 않습니다 - 당신은 그냥 데이터베이스에 대한 일반 액세스를 원하는 경우에, 잘, 당신은 관리자 :

이기 때문에, 일반 계정으로 로그인하면됩니다.

관리자 권한을 갖고 싶지만 유효성 검사 규칙을 계속 확인하려면 읽기/쓰기 규칙을 항상 만족시키는 "특별"계정을 사용해야합니다.

  1. 사용 databaseAuthVariableOverride 특별한 인증 속성을 설정하는 (이 그때 내 질문이었다로, 분명히 동등하게 안전) 내가 할 수있는 두 가지 기본 방법이 너무 몇 시간 전에이 우연히 내 question 설명 이는 루트 .read/.write 규칙에서 확인되며 서비스 계정의 경우 입니다.
  2. 일반 계정 (심지어 일반 전자 메일/암호)을 만들고 동일한 규칙 (루트 .read/.write)의 uid, 전자 메일 또는 기타 속성을 하드 코드하십시오.
+0

고맙습니다! 나는 이것에 너무 많은 시간을 보냈다 ;-). – androfan

관련 문제