Правила безопасности Firebase Firestore: Использование запросов в правилах безопасности? - PullRequest
0 голосов
/ 30 апреля 2020

Я занимаюсь разработкой веб-приложения для Firebase и Firestore, и вот что я пытаюсь сделать:

  • Пользователи могут загружать свои собственные сообщения и устанавливать его видимость для публикации c или личное.

  • Любой зарегистрированный пользователь может видеть публикации c, но только пользователи, подписавшиеся на него, могут просматривать личные сообщения. Я пытаюсь написать правила безопасности для этого.

Вот структура базы данных:

 db.collection('posts').doc({postid})  
 //When a user writes a post, a new document is created. Includes the boolean 'public' field and the 'uid' field, which stores the writer's uid.
 db.collection('subscription').doc({viewer_user_id}) 
 //Once the logged-in user subscribes to another user, a document is created under the user's UID. The doc includes array of the UID of the users the viewer is subscribing.

Вот описания соответствующих полей под каждым из документов в коллекциях 'posts' и 'subscription':

posts/{postid}: {
  'uid': Writer's uid (String)
  'public': Boolean value to reflect visibility. If false, it is private.
}
subscription/{viewer's uid}: {
   'subscription': Array of uids of the users the viewer is subscribing.
}

Итак, для личных документов основная идея c состоит в том, чтобы просмотреть документ зрителя в коллекции подписок, получить данные и проверить включен ли там идентификатор писателя. Это потребует некоторых Javascript кодов, но я не знаю, какой синтаксис будет в правилах безопасности Firestore, или это возможно или нет там с самого начала.

 rules_version = '2';
 service cloud.firestore {
    match /databases/{database}/documents {
       function publicOrSubscribed() {
          return request.auth.uid!=null&&(resource.data.public==true|| /*What could be the syntax here??*/)
       }
     match /posts/{postid} {
         allow read: if publicOrSubscribed();
         allow create: if request.auth.uid!=null;
         allow update, delete: if  request.auth.uid==resource.data.userid;
     }
   }
}

Есть предложения? Если это невозможно в правилах безопасности, какой может быть обходной путь? Заранее спасибо!

...