Firestore规则-交易

时间:2019-09-30 09:42:43

标签: google-cloud-firestore firebase-security

我最近被插入一个正在使用Firebase的项目中,并且正在研究安全规则,在大多数情况下,我能够成功地为几乎所有内容和单元测试创​​建规则。不幸的是,我忘记了创建某些文档后正在执行的交易。例如,创建请求后,该请求也会添加到requestsconsumer所属的每个用户的provider中。

match /Requests/{requestId} {
    allow read: if readRequest();
    allow create: if createRequest();
}
match /Users/{userId} {
    allow read: if isSignedIn();
    allow update: if isUser(userId);
}
function isUser(userId) {
    return request.auth.uid == userId;
}
function createRequest() {
      return incomingData().archived == false &&
        incomingData().attachmentURLs is list &&
        incomingData().description is string &&
        incomingData().location is string &&
        incomingData().minPrice is int &&
        incomingData().maxPrice is int &&
        incomingData().requestStateDate is timestamp &&
        incomingData().serviceId is string &&
        incomingData().serviceType is string &&
        incomingData().state == 'requested' &&
        isConsumer(incomingData().consumerUID) &&
        isProvider(incomingData().providerUID) &&
        isUser(incomingData().consumerUID) &&
        incomingData().keys().hasOnly(['archived', 'attachmentURLs', 'consumerUID', 'description', 'location', 'minPrice', 'maxPrice', 'providerUID', 'requestStateDate', 'serviceId', 'serviceType', 'state']) &&
        incomingData().keys().hasAll(['archived', 'attachmentURLs', 'consumerUID', 'description', 'location', 'minPrice', 'maxPrice', 'providerUID', 'requestStateDate', 'serviceId', 'serviceType', 'state'])
    }
function isConsumer(userId) {
    return get(/databases/$(database)/documents/Users/$(userId)).data.role == 'Consumer';
}
function isProvider(userId) {
    return get(/databases/$(database)/documents/Users/$(userId)).data.role == 'Provider';
}

用户仅应更新自己的信息,但与此同时,如果创建了请求,则创建请求的用户(使用者)应该能够将请求添加到另一个用户的requests映射中用户(提供者)。

0 个答案:

没有答案