Estou tentando configurar minhas regras de segurança para meu Cloud Firestore e não consigo descobrir o problema.
Este é meu código
Future<List<Document>> getDocumentsForGroup(String groupId) async {
final user = FirebaseAuth.instance.currentUser;
if (user == null) {
throw Exception('User not authenticated');
}
try {
final querySnapshot = await FirebaseFirestore.instance
.collection('Document')
.where('group_ids', arrayContains: groupId)
.get();
return querySnapshot.docs.map((doc) {
final data = doc.data();
return Documents(
...
);
}).toList();
} catch (e) {
throw Exception('Error loading the documents: $e');
}
}
Este é um trecho das minhas regras de segurança, assim como no documento:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Rule for Document collection
match /Document/{document} {
// Allow reads and deletion if the current user owns the existing document
allow read, delete, get: if request.auth.uid == resource.data.user_id;
// Allow creation if the current user owns the new document
allow create: if request.auth.uid == request.resource.data.user_id;
// Allow updates by the owner, and prevent change of ownership
allow update: if request.auth.uid == request.resource.data.user_id
&& request.auth.uid == resource.data.user_id;
}
Espero carregar os documentos, mas recebo a exceção mencionada acima.
A exceção ocorre não importa se há algum documento ou não. O UID do usuário e o user_id do documento são os mesmos, mas como já mencionado, o erro ocorre mesmo se não houver nenhum documento. O documento contém os campos group_ids e user_id.
Sei que posso permitir todas as operações de leitura e gravação, mas também estou procurando uma solução de produção.
Suas regras estão exigindo que a consulta filtre corretamente no campo
user_id
, mas seu código filtra apenas emgroup_ids
. Como sua consulta não filtra emuser_id
de uma forma que satisfaça os requisitos das regras, as regras simplesmente rejeitam o acesso completamente.Regras de segurança não são filtros (você deve ler e entender essa documentação). Regras não alterarão o conjunto de documentos resultantes. Ou a consulta tem acesso a todos os documentos solicitados, ou a nenhum , então sua consulta deve solicitar apenas documentos que seriam permitidos pelas regras aplicando um filtro que satisfaça os requisitos das regras.
Você busca documentos onde
group_ids
contémgroupId
. Mas sua regra de segurança verifica apenasuser_id
, nãogroup_ids
. Se um documento corresponder,group_ids
mas tiver um diferenteuser_id
, a leitura será negada.Modificado: