Ссылка на базу данных Access в правилах хранилища - PullRequest
0 голосов
/ 02 августа 2020

Я изо всех сил пытаюсь получить доступ к ссылкам на документы в правилах firestore. Моя база данных выглядит так. (Упрощено для краткости):

curriculum 
   session1

roles
   admin
       --- canEditContent
   user
       --- canEditContent

users
   userid
      --- role
          roles/admin <document reference>

Я хочу получить доступ к разрешениям администратора на основе ссылки на документ.

Я пробовал несколько способов, но, похоже, ничего не добился. Это мой код

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isSignedIn() {
      return request.auth != null;
    }
    function getUser() {
      return get(/databases/$(database)/documents/users/$(request.auth.uid));
    }
    function getUserRole() {
      let role = get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role;
      return get(role);
    }
    match /curriculum/{curriculum} {
      allow write: if isSignedIn() && getUserRole().data.canEditContent;
    }
    match /users/{userId} {
      allow read, update, delete, write: if request.auth != null && request.auth.uid == userId;
      allow create: if request.auth != null;
    }
  }
}

Я пробовал много способов и, похоже, не могу его решить.

Заранее спасибо

EDIT

Добавлены скриншоты коллекций ниже

Коллекция пользователей, показывающая роль как документ, относящийся к документу роли в коллекции ролей. Users collection

Roles collection Коллекция ролей

1 Ответ

1 голос
/ 02 августа 2020

Я вижу две проблемы в ваших правилах:

  1. get требуется полный путь к документу, поэтому ваша функция getUserRole не будет работать. Попробуйте вместо этого:

    function getUserRole() {
      let role = getUser().data.role;
      return get(path("/databases/" + database + "/documents/" + role));
    }
    
  2. Ваше правило использует роль canEditContent, но данные, которые вы показываете, используют editContent, это специально?

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

...