Tengo una base de datos en tiempo real en mi aplicación web nextjs y la uso para notificaciones.
El esquema de mi db es el siguiente:
Escribo datos solo desde el lado del servidor como administrador, pero los leo desde el lado del cliente de la siguiente manera:
const fetchNotifications = () => { const starCountRef = ref(db, `notifications/${user?.id}`); const q = query(starCountRef, orderByChild('createdAt'), limitToLast(100)); onValue(q, (snapshot) => { //Handle data }); };En este momento tengo las siguientes reglas:
{ "rules": { ".read": "auth != null", ".write": false, "notifications":{ "$user_id":{".indexOn":"createdAt"} } } }Como puede ver, todos los que están autenticados pueden leer todo. Quiero que el usuario lea solo sus propias notificaciones. El ObjectID es una referencia de mi mongoDB.
Por ejemplo, si tengo ID = 1 , quiero acceder a los datos solo para la ruta /notifications/1 y si trato de obtener datos de /notifications/2 , no obtengo nada (o error).
En primer lugar, ¿cómo puedo ver desde firebase la identificación que uso en mi base de datos local? ¿Tengo que avisarle primero? Segundo, ¿cómo puedo escribirlo en mis reglas?
Si las claves directamente debajo de notifications son los UID de autenticación de Firebase (como sugieren sus reglas), puede limitar el acceso solo al nodo del usuario con:
{ "rules": { //".read": "auth != null", // 👈 Remove this line ".write": false, "notifications":{ "$user_id":{ ".read": "auth.uid === $user_id", // 👈 add this line ".indexOn":"createdAt" } } } }Consulte también la documentación de Firebase sobre cómo asegurar el acceso exclusivo del propietario del contenido .