# #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);
}