Google cloud firestore Firestore规则-交易

Google cloud firestore Firestore规则-交易,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,我最近加入了一个使用firebase的项目,我正在研究安全规则,我能够成功地为几乎所有事情创建规则,并在大多数情况下创建单元测试。不幸的是,我忘记了在创建一些文档之后正在进行的事务。例如,一旦创建了请求,它也会添加到属于它的每个用户、消费者和提供者的请求中 match /Requests/{requestId} { allow read: if readRequest(); allow create: if createRequest(); } match /Users/{use

我最近加入了一个使用firebase的项目,我正在研究安全规则,我能够成功地为几乎所有事情创建规则,并在大多数情况下创建单元测试。不幸的是,我忘记了在创建一些文档之后正在进行的事务。例如,一旦创建了请求,它也会添加到属于它的每个用户、消费者和提供者的
请求中

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';
}

用户只需更新自己的信息,但同时,如果创建了请求,则创建请求的人(消费者)应该能够将请求添加到另一个用户(提供商)内部的
请求
映射中。

您当前的问题是什么?问题是什么?你能分享iConsumer和iProvider吗?尽管他们与本案例无关,但还是更新了问题。创建请求时,用户文档也会使用事务进行更新(它将请求添加到用户内部的requests数组中)。问题是,为了做到这一点,我需要允许用户文档中的更新,即使请求不是来自该用户文档的所有者。请求有提供者和使用者,使用者是创建请求的人(并最终将其添加到提供者和使用者用户文档中),这会在用户文档中打开一个安全漏洞,因为其他用户可以对其进行编辑。您是否可以编辑问题,而不是在注释中添加信息,并解释正在发生的一切,包括未按预期方式工作的事务代码?