Создать переменную для повторного использования в правилах firestore

#firebase #google-cloud-firestore #firebase-security

#firebase #google-облако-firestore #firebase-безопасность

Вопрос:

В сложном продукте часто приходится использовать одни и те же условия правила, например, если пользователь является администратором:

 match /games/{game} {
  allow read: if true;
  allow write: if request.auth != null amp;amp; get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true
}
match /locations/{location} {
  allow read: if true;
  allow write: if request.auth != null amp;amp; get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true
}
  

Есть ли способ сохранить условие внутри переменной, чтобы повторно использовать его (вместо того, чтобы записывать его каждый раз)? Например:

 const isAdmin = request.auth != null amp;amp; get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;    

match /games/{game} {
  allow read: if true;
  allow write: if isAdmin
}
match /locations/{location} {
  allow read: if true;
  allow write: if isAdmin
}
  

Я понятия не имею, какой язык стоит за правилами firestore и какие ресурсы я могу использовать.

Комментарии:

1. Если вы хотите узнать больше о синтаксисе правил безопасности, вам следует начать с документации. firebase.google.com/docs/firestore/security/get-started

Ответ №1:

Да, вы можете использовать пользовательские функции, как описано в документе.

В вашем случае это было бы что-то вроде следующих строк (непроверено):

 function isAdmin() {
  return request.auth != null amp;amp; get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;    
}
match /games/{game} {
  allow read: if true;
  allow write: if isAdmin();
}
match /locations/{location} {
  allow read: if true;
  allow write: if isAdmin();
}
  

Обратите внимание, что позиция функции в «иерархии» правил безопасности важна. Взгляните на это официальное видео для получения более подробной информации.