因此,我正在构建一个包含多个集合和用户邀请的多租户应用程序。由于我不知道注册将使用哪个用户ID,并且我希望公司开始对其用户数据进行更改和更新,因此我预先设置了用户ID,并在以下几种路径中使用它:
/companies/{company}/customers/{userId}
/users/{userId}
现在,此userId几乎是用逗号替换点的电子邮件。点是Firebase中不允许使用的字符,但逗号是逗号,反之亦然,例如电子邮件,因此这是有意义的,并且在那里没有问题。
问题是当我需要制定一些规则时。例如,我在配置中有此选项,因为我希望管理员可以访问每个公司:
function cleanEmail(){
return request.auth.token.email.split('.').join(',') //Here I also tried %2C
}
function isSuperadmin() {
return exists(/databases/$(database)/documents/admins/$(cleanEmail()))
}
match /companies/{company} {
allow write: if isSuperadmin();
allow read: if isSuperadmin() || belongsToCompany(company)
}
模拟器坏了,但是我不明白为什么,所以我什至发送了一个错误报告。最终,我尝试对路径进行硬编码,然后发现了问题:
function isSuperadmin() {
return exists(/databases/$(database)/documents/admins/test,account@gmail,com) //Same issue with get()
}
我尝试使用exist(),因为我认为它可能是get()的错误,但问题仍然存在。我认为这应该是一个错误,因为这是有效的Firestore路径,而且我已经看到一些人已经在使用这种“干净的电子邮件”策略。
有趣的是,这不是在第一次测试期间发生的,我意识到只有在逗号位于@之前,才会发生此错误。如果您在此之前删除一个,然后保留第二个,则似乎可以工作:
我可以在干净的电子邮件中添加一个新步骤,将其转换为base64,并且可以正常工作。如果有人有很好的解决方案。
答案 0 :(得分:0)
我做了类似的概述:
/invitation
/fb-generated-doc-name
email: somecustomer@gmail.com
trip: db-ref-to-trip
/usertrips
/doc-name-is-UID
trip: db-ref-to-trip
/trips
/fb-generated-doc-name
{ ... describes the trip ... }
onCreate认证用户的轮廓是:
exports.authDidCreateUser = functions.auth.user().onCreate((authUser, context) => {
/*
find invitation where email == authUser.email
let docref = collection('usertrips').doc(authUser.uid)
docref.set({ trip: invitation.trip })
*/
});