Правила Firestore нарушаются, если путь к документу имеет запятую - PullRequest
0 голосов
/ 29 мая 2019

Итак, я создаю мультитенантное приложение, которое включает множество коллекций и приглашение пользователя.Поскольку я не знаю, какой идентификатор пользователя будет использовать регистрация, и я хочу, чтобы компании начали вносить изменения и обновления в свои пользовательские данные, я предварительно устанавливаю идентификатор пользователя и использую его по нескольким направлениям:

/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()
    }

enter image description here

, с которой я пытался существовать (), потому что я думал, что это можетбыть ошибкой с get (), но проблема остается.Я считаю, что это должно быть ошибкой, так как это правильный путь Firestore, и я видел некоторых людей, уже использующих эту стратегию «чистой электронной почты».

Забавно, что этого не произошло во время первого тестирования, и я понял, что эта ошибка возникает, только если запятая ДО @.Если вы удалите предыдущее и оставите второе, похоже, оно будет работать:

enter image description here

Я мог бы добавить новый шаг к чистой электронной почте, которыйпревращает это в base64, и это может сработать.Если у кого-то есть решение отличное.

1 Ответ

0 голосов
/ 29 мая 2019

Я делаю что-то похожее, что выглядит следующим образом:

/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 auth'd:

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 })
  */
});
...