Regole di sicurezza Firebase per verificare il valore univoco di un figlio #AskFirebase

inserisci la descrizione dell'immagine qui

La struttura del mio database Firebase è come mostrato sopra. Come posso assicurarmi che gli URL siano unici e non ci siano duplicati? Dato che questi sono URL, non li posso usare direttamente come percorsi, sono costretto a usarli come valori. Quindi soluzioni come questa non funzioneranno.

Se vuoi che qualcosa sia unico nel database di Firebase, devi memorizzarlo come chiave. Ciò garantisce automaticamente l’unicità.

Come hai notato, alcuni caratteri non possono essere usati in una chiave. In tal caso dovrai codificare il valore per consentirlo in una chiave e assicurarti di non perdere le informazioni che rendono il valore univoco. Un caso molto semplice di questo è quando qualcuno vuole memorizzare un indirizzo email univoco nel database. Poiché una chiave non può contenere . personaggi, abbiamo bisogno di codificarlo. Una codifica comune per questo è sostituire il . con a,:

 users: { "uidOfPuf": { name: "Frank van Puffelen", email: "[email protected]" } }, emailAddresses: { "[email protected],com": "uidOfPuf" } 

Usando a , è particolarmente utile quando si tratta di indirizzi e-mail, dal momento che un indirizzo e-mail non può contenere un,.

Ma in generale ciò che conta è che il valore codificato è “ragionevolmente garantito come unico” e che il valore reale viene comunque memorizzato da qualche parte (come /users/$uid/email sopra).

Per codificare gli URL, iniziare semplicemente con lo stripping di tutti i caratteri non validi:

 var url = "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase"; ref.child(url.replace(/[\.\/]/g, '')).set(url); 

I negozi:

 "http:stackoverflowcomquestions39149216firebase-security-rules-to-check-unique-value-of-a-child-askfirebase": "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase" 

Aggiornamento : sto considerando di utilizzare un semplice codice hash per la chiave, che porta a chiavi di lunghezza più ragionevoli:

 // from http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery String.prototype.hashCode = function(){ var hash = 0; if (this.length == 0) return hash; for (i = 0; i < this.length; i++) { char = this.charCodeAt(i); hash = ((hash<<5)-hash)+char; hash = hash & hash; // Convert to 32bit integer } return hash; } var url = "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase"; ref.child(url.hashCode()).set(url); 

Porta a:

 20397229: "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase"