Не удается сопоставить request.auth.id с идентификатором документа в правилах Firestore

# #kotlin #google-cloud-firestore

Вопрос:

Я разрабатываю приложение с помощью Flutter. У меня есть база данных на Firestore со структурой : Пользователи/(Идентификатор пользователя)/коллекция/документ Здесь Идентификатор пользователя-это уникальный идентификатор пользователя, который создает документ (идентификатор пользователя). Код, используемый для получения идентификатора пользователя, является

 user.uid;
 

где пользователь является экземпляром FirebaseUser.
Я пытаюсь настроить правила таким образом, чтобы только в том случае, если request.auth.uid совпадает с идентификатором документа (идентификатором пользователя), только пользователь может читать/писать.

 service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{documentID} {
      allow read, write: if isOwner(documentID);
    }

    function isOwner(documentID){
        return request.auth.uid == documentID;
    }
  }
}
 

Но я получаю ошибку с этим

ошибка: Статус{код=РАЗРЕШЕНИЕ_ДАНО, описание=Отсутствуют или недостаточно разрешений., причина=null}

Это код, выполняющий запрос.

 class EmployeeList extends StatefulWidget {
  static bool isMale;
  final String userId;
  EmployeeList([this.userId]);
  void setIsMale(bool gen) {
    isMale = gen;
  }

  bool get getIsMale => isMale;

  @override
  State<StatefulWidget> createState() => _EmployeeList();
}

class _EmployeeList extends State<EmployeeList> {
  String employeeName;

  final TextEditingController textEditingController = 
TextEditingController();
  String gender;
  int keyIndex;
  CollectionReference listColRef;
  bool firstTime;
  Firestore db = Firestore.instance;

  @override
  void initState() {
    gender = EmployeeList().getIsMale ? "Male" : "Female";
    listColRef = 
db.collection('Users').document(widget.userId).collection('EmployeeList');
    print(widget.userId);
    super.initState();
  }

 @override
 Widget build(BuildContext context) {
   return Scaffold(
      backgroundColor: Colors.grey[100],
      appBar: AppBar(
         title: Text('Employees'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(5),
        child: StreamBuilder<QuerySnapshot>(
            stream: listColRef.where('Gender', isEqualTo: 
        gender).snapshots(),
 

Это структура базы данных: https://imgur.com/a/aI6UikO

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

1. Пожалуйста, отредактируйте вопрос, чтобы показать код, который выполняет запрос, который работает не так, как вы ожидаете.

2. Вы уверены, что uid запроса и ваш идентификатор документа совпадают? Пользователи проверки подлинности и пользователи базы данных по умолчанию не связаны с помощью firebase.

3. В дополнение к коду, который запросил Дуг, мы, вероятно, также захотим увидеть документ, который вы пытаетесь прочитать. Скриншот, как правило, лучше всего подходит для этого.

4. Будет ли нормально, если я свяжу репозиторий Github? Или вы хотите, чтобы я добавил сам код?

5. Такова структура базы данных. imgur.com/a/aI6UikO

Ответ №1:

Правила вашей базы данных не соответствуют вашему запросу. Ваш запрос пытается найти документы в коллекции с использованием шаблона /Users/{userId}/EmployeeList . Но ваши правила разрешают доступ только к документам в соответствии /Users/{documentID} . Если вы хотите разрешить доступ к документам внутри вложенных вложенных коллекций, вам нужно будет убедиться, что весь путь совпадает. Например:

 match /Users/{userId}/EmployeeList/{id} {
  allow read, write: if isOwner(userId);
}