提问者:小点点

创建的Firestore安全规则空值错误


我有以下安全规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    function no_write(field) {
      return (!(field in request.resource.data) && !(field in resource.data)) 
      || (field in request.resource.data && field in resource.data && resource.data[field] == request.resource.data[field]);
    }

    function create_by_owner(field) {
      return (!(field in request.resource.data) && !(field in resource.data)) || ((field in request.resource.data) && !(field in resource.data))
      || (field in request.resource.data && field in resource.data && resource.data[field] == request.resource.data[field]);
    }

    match /ll_profile/{user_id} { 
      allow read: if true;
      allow write: if request.auth != null && user_id == request.auth.uid
      && no_write("last_changed") && create_by_owner("native_language");      
    }    
  }
}

no_write函数限制要修改的字段。 并且create_by_owner只允许创建一个字段,如果该字段已经存在,则不能进行任何修改。 但是当我运行这个单元测试时:

    it("succeed to write to my own document authenticated displayed_name field", async () => {
        const db = get_firestore(my_auth);
        const testDoc = db.collection(collection).doc(my_id);
        await firebase.assertSucceeds(testDoc.set({displayed_name: "123"}, {merge: true}));
    })

它给我一个空值错误的错误。 对于'create'@l30,我不限制字段displayed_name的写访问。 我的规则的哪一部分限制了这个写访问?


共1个答案

匿名用户

由于create上不存在resource

如果需要在规则中使用resource.data,则必须将write拆分到createupdate