Итак, я создаю мультитенантное приложение, которое включает множество коллекций и приглашение пользователя.Поскольку я не знаю, какой идентификатор пользователя будет использовать регистрация, и я хочу, чтобы компании начали вносить изменения и обновления в свои пользовательские данные, я предварительно устанавливаю идентификатор пользователя и использую его по нескольким направлениям:
/companies/{company}/customers/{userId}
/users/{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()
}
, с которой я пытался существовать (), потому что я думал, что это можетбыть ошибкой с get (), но проблема остается.Я считаю, что это должно быть ошибкой, так как это правильный путь Firestore, и я видел некоторых людей, уже использующих эту стратегию «чистой электронной почты».
Забавно, что этого не произошло во время первого тестирования, и я понял, что эта ошибка возникает, только если запятая ДО @.Если вы удалите предыдущее и оставите второе, похоже, оно будет работать:
Я мог бы добавить новый шаг к чистой электронной почте, которыйпревращает это в base64, и это может сработать.Если у кого-то есть решение отличное.