Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección.
Tengo algunos requests
documentos que pueden presentar una subcolección llamada status
. Mis reglas actuales son algo así:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// I use it to check if user is signed in
function userSignedIn() {
return request.auth!= null;
}
match /requests/{requestId} {
// I use it to check if user is the owner of the request
function userCanAccess () {
return userSignedIn() && request.auth.uid == get(/databases/$(database)/documents/requests/$(requestId)).data.userId;
}
// allow read to logged user who own request
allow read, update: if userCanAccess();
// anyone can create a new request
allow create: if true;
// no one can delete the request
allow delete: if false;
match /status/{statusId} {
// allow read and update of status to logged user who own request
allow read, update: if userCanAccess();
// anyone can create the status
allow create: if true;
// no one can delete the status
allow delete: if false;
}
}
}
}
Mi primera forma de verificar si el usuario tenía acceso fue por request.auth.uid == resource.data.userId
, sin embargo, solo funciona para requests
documentos, no para status
documentos, ya que no tienen el userId
campo.
Estoy usando flutter para hacer la solicitud con el código:
FirebaseFirestore.instance
.collection('requests')
.where('userId', isEqualTo: user.uid)
.orderBy('requestedOn', descending: true)
.snapshots()
.listen((snapshot) {
// Here I read requests and their status
});
Sin embargo, estoy recibiendo Error: [cloud_firestore/permission-denied] Missing or insufficient permissions.
. ¿Cómo puedo resolverlo (o depurarlo)? Usando las reglas del patio de recreo en firestore, con exactamente lo mismo uid
, puedo completar la lectura.
Solución del problema
Me pregunto si la get()
llamada puede estar causando problemas. Prueba esto:
function userCanAccess () {
return userSignedIn() && request.auth.uid == requestId.data.userId;
}
No hay comentarios:
Publicar un comentario