是否可以检查Firestore安全规则中是否验证了请求用户的电子邮件?
就像是:
function isEmailVerified() {
return request.auth.emailVerified == true;
}
Run Code Online (Sandbox Code Playgroud) 我想验证Firebase存储规则在自动Node.js测试中是否按预期工作。
可以使用Firebase Admin API或服务帐户访问Firebase存储桶,如使用Node.js将文件上传到Firebase存储中所述。
问题在于,使用Admin API或服务帐户会绕过存储规则。
由于Firebase Node.js API不包含firebase.storage功能,因此没有以给定的Firebase用户访问Firebase存储的明显方法。
简而言之,如何以给定的Firebase用户/ uid从Node.js访问Firebase存储?
我有一个创建以下JSON结构的表单。
{
"reviewed":false,
"title":"Just a title",
"user":"UYV9TRKXfNW1NeCyFyfjZfagJ8B",
"items":[
{
"age":"33",
"experience":"Newcomer",
"image":"https://image-url",
"job":"Nerd",
"name":"Testname",
"party":"AAA",
"type":"person"
},
{
"age":"33",
"experience":"Newcomer",
"image":"https://image-url",
"job":"Informatiker",
"name":"Testname",
"party":"AAA",
"type":"person"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如何使用Firestore的安全规则检查“项目”的值?有没有一种方法可以循环/迭代数组?
TLDR:request.resource.data.size()在将一些布尔值和嵌套对象写入文档时,firestore规则中有什么内容?不知道该文档的意思是“ 条目在地图”(https://firebase.google.com/docs/reference/rules/rules.firestore.Resource#data,https://firebase.google.com/docs/ reference / rules / rules.Map)和我的假设在规则模拟器中测试时似乎是错误的(与相似的问题request.resource.data.keys().size())。
较长的版本:在Firestore规则中遇到问题,该规则无法按预期更新数据(尽管在规则模拟器中进行了类似的测试)。缩小了问题的指向范围,可以看出它是检查request.resource.data.size()等于某个数字的规则。
传递给firestore update函数的数据示例如下
Object {
"parentObj": Object {
"nestedObj": Object {
"key1": Timestamp {
"nanoseconds": 998000000,
"seconds": 1536498767,
},
},
},
"otherKey": true,
}
Run Code Online (Sandbox Code Playgroud)
时间戳是通过生成的firebase.firestore.Timestamp.now()。这在规则模拟器中似乎可以正常工作,但是在执行时对于实际数据却不行
let obj = {}
obj.otherKey = true
// since want to set object key name dynamically as nestedObj value,
// see /sf/answers/3310730671/
obj.parentObj = {} // needed for adding nested dynamic keys …Run Code Online (Sandbox Code Playgroud) 阅读Firebase规则文档对于如何阻止匿名访问特定集合或文档我一无所获。
换句话说,我要阻止未登录的用户,并且我也要阻止以匿名身份登录的用户。我只允许用户以自己的身份登录(通过电子邮件,Facebook,Google,SMS等)。
我怎样才能做到这一点?
这是我想出的代码,不起作用:
service cloud.firestore {
match /databases/{database}/documents {
}
match /collectionExample/{documentExample} {
allow create: if request.auth.uid != null && request.auth.token.isAnonymous != false;
allow read: if request.auth.uid == resource.data.userId;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一组名称都以ABC开头的集合,我想编写一条适用于所有集合的规则,无论ABC后面是什么。就像是:
match /ABC*/{anyid} {
allow read, write;
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?在“规则控制台”中,没有突出显示语法错误,但是“模拟器”不允许我使用以下方式访问表:
GET /ABC123/456
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我试图将对Firestore的某些操作限制为创建或附加到数组。我应该怎么做?我怎样才能辨别arrayUnion()从arrayDelete()?将数组操作与所有其他操作区分开来怎么办?
更新:到目前为止,从我深入研究Firestore API所得的信息来看,我猜测可能可以进行某些操作allow create, FieldValue.arrayUnion: if true,但是我尚未对其进行测试,将在测试时进行更新。
因此,我试图将规则设置到存储中,但是我需要访问firestore才能对其进行正确设置。
这是我的示例:
在我的firestore数据库中,我有一个users集合,其中有一个名为的集合items。路径如下所示:/users/items/{itemId}
我希望用户可以使用以下路径将文件读写到存储中:/items/{id}/file.png仅当{id}该项目的已存在于itemsFirestore数据库集合中时。有没有办法使用firestore将规则正确设置到存储中?
我尝试了这个:
service firebase.storage {
match /b/{bucket}/o {
match /items/{item}/{allPaths=**} {
allow read, write: if exists(/databases/{database}/documents/users/$(request.auth.uid)/items/$(item));
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用:/
谢谢你的帮助!
我的第一个问题是如何指定该数据库定义的安全规则?有一些最佳实践方法吗?
我们的第一个想法是这样做:
match /databases/{database}/documents/projects/{projectUid}/{document=**} {
allow read: if
(/databases/$(database)/documents/projects/$(projectUid)/companyId) ===
(/databases/$(database)/documents/users/$(request.auth.uid)/companyId)
}
Run Code Online (Sandbox Code Playgroud)
但是根据文档,这意味着我们每个读取基本上需要3个读取(2个安全性查询和1个从DB实际读取)。这似乎是对查询的浪费。
有没有比这更好的方法了?我们正在考虑更改子集合:
这样,我们可以使用与文档中类似的方法,其中每个匹配项都包含{companyId},在allow语句中,我们将使用类似
match /databases/{database}/documents/companies/{companyId}/projects/{projectId} {
allow read: if
exists(/databases/$(database)/documents/companies/$(companyId)/users/$(request.auth.uid));
}
Run Code Online (Sandbox Code Playgroud)
感谢您提供有关如何以最可扩展且最安全的方式构建它的任何建议。
如果我的文档保存在/recordTypeX/{autoKey},结构如下:
memberUserIds [object]
hjfjkh32390u09j: true
kjsklfjkslfklj3: true
....
skfksdjk2249fks: true
someStringField: "Bork, bork, bork!"
someNumericField: 88
Run Code Online (Sandbox Code Playgroud)
如何编写安全规则以检查是否存在memberUserIds?我尝试了以下操作,但是CLI不喜欢该语法。
allow read if resource.data.memberUserIds.$(request.auth.uid) == true;
我知道变量可以在get()和的路径中使用exists(),因此我认为也可以使用变量寻址字段,但是我无法克服语法错误。这可能吗?
在某些背景下,我试图在集合中的每个文档上维护一个(小)userId列表,以便我可以进行查询,以使我可以检索当前用户所属的集合中的所有文档。
我在阅读了Firebase文档中曾经使用过的指南(称为列表,集合和数组)后,采用了这种方法。
感谢您的任何想法。