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