Сопоставление пользовательских требований с идентификатором документа Firestore - PullRequest
0 голосов
/ 08 октября 2018

Мои данные выглядят примерно так:

/databases/schools/{schoolId}/faculty
                             /students
                             /etc

У меня есть группа людей с customClaim "schoolId" в своих аккаунтах.Я только хочу, чтобы они имели доступ к факультету, студентам и т. Д. Той школы, к которой они принадлежат.Пробовал много итераций этого правила, последняя из которых

service cloud.firestore {
  match /databases/schools/{document} {
    match /{doc=**} {
      allow read, write: if user.token.schoolId == document;
    }
  }
}

Другие итерации включают:

service cloud.firestore {
  match /databases/schools/{document} {
    allow read, write: if user.token.schoolId == document;
  }
}

и

service cloud.firestore {
  match /databases/schools {
    match /{document=**} {
      allow read, write: if user.token.schoolId == document;
    }
  }
}

или

service cloud.firestore {
  match /databases/{database}/documents {
    match /{$document} {
      allow read, write: if resource.id == user.token.schoolId;
    }
  }
}

Такое чувство, что это должно быть довольно простым делом, но я не могу понять это (у меня 12-я итерация)

Мне кажется, я понимаю, что последний не работает, потому что еслиЯ пытаюсь получить / database / schools / school1 / faculty / abc123, тогда resource.id фактически ссылается на abc123, а не school1.

Пример пользователя выглядит так, когда я декодирую токен:

uid: "gobblygook"
displayName: null
photoURL: null
email: "test-email@yopmail.com"
emailVerified: true
phoneNumber: null
isAnonymous: false
apiKey: "{apikey}"
appName: "[DEFAULT]"
authDomain: "{mydomain}.firebaseapp.com"
lastLoginAt: "1538972960000"
createdAt: "1538868952000"
schoolId: "school1"

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Закончилось, выясняя это сегодня утром, благодаря Renaud, который указал мне правильное направление!Также благодаря этому SO-ответу Рекурсивные подстановочные знаки в правилах безопасности Firestore не работают должным образом

service cloud.firestore {
  match /databases/{database}/documents {
    match /schools/{schoolId} {
      allow read, write: if request.auth.token.schoolId == schoolId
    }

    match /schools/{schoolId}/{document=**} {
      allow read, write: if request.auth.token.schoolId == schoolId
    }
  }
}

Кажется, что делает то, что я хочу (я могу переключиться == равно!= и мой пользователь больше не имеет доступа)

0 голосов
/ 08 октября 2018

Должно работать следующее:

service cloud.firestore {
  match /databases/{database}/documents {

     match schools/{schoolId} {
       allow read: if request.auth.token.schoolId == resource.data.schoolId;
       allow write: if request.auth.token.schoolId == request.resource.data.schoolId;
     }        

  }
}

Обратите внимание:

  1. Я предполагаю, что с /databases/schools/{schoolId}/ вы имеете в виду, что корневая коллекция равна schools, а не databases.
  2. Вы должны использовать request.auth.token.schoolId для извлечения пользовательской заявки через токен ID пользователя, см. https://firebase.google.com/docs/auth/admin/custom-claims
  3. Вместо использования request.resource.data.schoolId; в правиле записииз resource.data.schoolId;
...