Estoy tratando de evitar que un usuario cree campos de spam dentro de un documento, campos que son diferentes del estado del documento original (después de que se haya creado) mis reglas actuales se parecen a las siguientes:
//Create allow create : if request.auth != null && request.auth.uid == userId && request.resource.data.keys().hasOnly( ['clients', 'verifiedEmail', 'accountStatus' ,'createdAt', 'endsAt']) allow read: if request.auth != null && request.auth.uid == userId allow update : if request.auth.uid == userId && request.auth.uid == userId && request.resource.data.keys().hasAny( ['clients', 'verifiedEmail', 'accountStatus' ,'createdAt', 'endsAt']])La idea aquí es que, en un caso, querré actualizar los clientes
await updateDoc(doc(db, 'Data', userCredential.user.uid), { clients: //data, });en otro caso, quiero actualizar el correo electrónico verificado. mientras evita que un usuario cree un archivo como
await updateDoc(doc(db, 'Data', userCredential.user.uid), { shouldnotbecreated: //some spam, });En el fragmento de actualización de Reglas
si uso hasOnly() es tan estricto que necesita que toda la carga útil sea la misma. como en ['clients', 'verifiedEmail', 'accountStatus' ,'createdAt', 'endsAt'] .
Si uso hasAll() o hasAny() , se crea un archivo de spam.
Funcionó para mí usando una combinación de request.resource.data.diff(resource.data).affectedKeys().hasOnly()
//Create allow create : if request.auth != null && request.auth.uid == userId && request.resource.data.keys().hasOnly( ['clients', 'verifiedEmail', 'accountStatus' ,'createdAt', 'endsAt']) allow read: if request.auth != null && request.auth.uid == userId allow update : if request.auth.uid == userId && request.auth.uid == userId && request.resource.data.diff(resource.data).affectedKeys().hasOnly( ['clients', 'verifiedEmail', 'accountStatus' ,'createdAt', 'endsAt']])