Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

266
Visualizações
¿Qué regla necesito para permitir el acceso a los datos de los usuarios en Firestore?

Estoy aprendiendo Firestore y he creado una aplicación angular. Estoy usando la autenticación de Firebase y tengo problemas para descifrar las reglas que se deben usar para permitir que un usuario acceda a sus datos. Entonces, por ejemplo, una colección de productos en la que cada producto tiene un ID de usuario que en realidad es su dirección de correo electrónico.

Ejemplo: ingrese la descripción de la imagen aquí

La regla actual que tengo es la siguiente y no funciona (he intentado todo lo que puedo deducir según documentos, stackoverflow, etc.):

 rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userEmail} { allow read, write: if request.auth != null; } match /products/{userId}{ allow read, write: if request.auth.uid.userEmail == userId } } }

Lo único que he hecho que funciona (es decir, recupero todos los productos) es si hago una coincidencia/{document=**) que lo abre a cualquiera que NO es lo que quiero. :)

¿Algunas ideas?

Editar: en caso de que alguien se pregunte sobre el código angular. Nuevamente, si configuro la regla para permitir cualquier cosa, SÍ obtendré datos de vuelta. Si lo restrinjo, hasta ahora no obtengo nada. Entonces, sé que el código funciona (getAll), por lo que debe ser que las reglas no son correctas.

Editar: actualicé el código para escribir el correo electrónico de los usuarios en la consola justo antes de solicitar todos los datos de productos de la tienda. Emitió con éxito el correo electrónico del usuario.

 import { Injectable } from '@angular/core'; import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore'; import { AngularFireAuth } from '@angular/fire/auth'; import { Product } from '../models/product.model'; @Injectable({ providedIn: 'root' }) export class ProductsService { private dbPath = '/products'; productsRef: AngularFirestoreCollection<Product>; constructor(public afAuth: AngularFireAuth, private db: AngularFirestore) { this.productsRef = db.collection(this.dbPath); } getAll(): AngularFirestoreCollection<Product>{ this.afAuth.authState.subscribe(user => { console.log('Dashboard: user', user); if (user) { let emailLower = user.email.toLowerCase(); console.log("Email: " + emailLower); } }); return this.productsRef; } create(product: Product): any { return this.productsRef.add(product); } update(id: string, data: any): Promise<void>{ return this.productsRef.doc(id).update(data); } delete(id: string): Promise<void> { return this.productsRef.doc(id).delete(); } }
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Creo que hay algún problema con las reglas de seguridad construidas. Puedeconsultar las reglas de seguridad de Firestore para obtener más información sobre cómo escribir reglas y, para probar sus reglas, puede consultar la documentación donde se menciona:

Cloud Firestore proporciona un simulador de reglas que puede usar para probar su conjunto de reglas. Puede acceder al simulador desde la pestaña Reglas en la sección Cloud Firestore de Firebase console. El simulador de reglas le permite simular lecturas, escrituras y eliminaciones autenticadas y no autenticadas.

a) En la captura de pantalla de la colección de productos de la base de datos de Firestore, el ID del documento parece ser una secuencia alfanumérica generada automáticamente. Por lo tanto, las siguientes reglas de coincidencia coincidirán con el ID del documento (generado automáticamente) en las variables {userEmail} y {userId} en lugar del correo electrónico o el ID del usuario, como sugiere el nombre de la variable.

 match /users/{userEmail} match /products/{userId}

Por supuesto, puede crear ID de documento para tener direcciones de correo electrónico en lugar de secuencias generadas automáticamente, en cuyo caso las condiciones de coincidencia anteriores podrían funcionar como se esperaba.

b) El uso de request.auth.uid.userEmail es incorrecto. La forma correcta de referirse al correo electrónico desde el estado de autenticación de solicitud de un usuario es "request.auth.token.email" . Puede leer acerca de las request.auth & resource variable references en los documentos públicos de Firestore: documentación 1 y documentación 2 para usar la sintaxis correcta.

c) A continuación se presentan algunas correcciones realizadas a las reglas de seguridad. Esto debería funcionar.

 rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userDocId} { allow read, write: if request.auth != null; } match /products/{productDocId}{ allow read, write: if request.auth.token.email == resource.data.userId } } }
about 4 years ago · Juan Pablo Isaza Relatório

0

Creo que la sintaxis correcta es

 allow read, write: if request.auth.token.email == userId

Consulte la documentación aquí para obtener más detalles.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda