Firebase数据库规则,仅在document属性等于通过身份验证的用户ID时才允许删除

时间:2019-04-25 04:00:21

标签: firebase google-cloud-firestore firebase-security-rules

我无法在我的Firebase数据库中添加安全规则。我只允许在经过身份验证的用户等于投票文档上的uid属性的情况下删除投票。除了我在匹配项/ votes / {voteId}上创建的删除规则外,一切都正常。

我尝试使用resource.data.uid进行此操作,但是模拟器抱怨,并且出现错误“运行模拟时出错-错误:simulator.rules空值错误”

service cloud.firestore {
  match /databases/{database}/documents {

    match /polls/{pollId} {
      allow read;
      allow delete: if getUserData().roles.keys().hasAny(['admin']);
      allow create: if isSignedIn();
    }

    match /users/{userId} {
        allow read, write: if isOwner(userId);
    }

    match /votes/{voteId} {
        allow read;
      allow create: if isSignedIn();
      allow delete: if request.auth.uid == resource.data.uid;
    }
  }

  /// Functions ///
  function isSignedIn() {
    return request.auth != null
  }

  function isOwner(userId) {
    return request.auth.uid == userId
  }

}

更新

我还尝试使用/ {document = **}通配符,它​​给了我同样的Null值错误

match /votes/{document=**} {
        allow read;
      allow create: if isSignedIn();
      allow delete: if request.auth.uid == resource.data.uid;
    }

我也尝试使用get()函数,但收到错误“找不到函数错误:名称:[get]

match /votes/{voteId} {
  allow read;
  allow create: if isSignedIn();
  allow delete: if get(/databases/$(database)/documents/votes/$(voteId)).data.uid == request.auth.uid
}

1 个答案:

答案 0 :(得分:1)

您是否创建了一个名为uid的文档?像这样。

firebase.firestore().collections("votes").add({uid: firebase.auth().currentUser.uid});

resource是一个Firestore文档。

resource.data是文档数据的映射。

firebase控制台上的Simulator正在使用项目中现有的真实Firestore数据。

我认为将规则更改为以下规则会更好。

...
    match /votes/{voteId} {
        allow read;
      allow create: if isSignedIn() && request.auth.uid == request.resource.data.uid;
      allow delete: if isSignedIn() && request.auth.uid == resource.data.uid;
    }
...

  function isSignedIn() {
    return request.auth.uid != null
  }
...

请参阅: