2013-03-31 6 views
5

Kontynuując od tego wątku, na HN: https://news.ycombinator.com/item?id=5462769Wdrażanie usunąć tweet i jak/upvote funkcjonalność w Firebase

przeczytaniu pliku rules firefeed odpowiedział na wiele pytań do mnie, z wyjątkiem tych dwóch:

  1. Edytowanie istniejącego tweeta jest niedozwolone (".write": "! Data.exists()"). Jak możesz sprawić, by nie było edytowalne, ale usuwane przez autora?
  2. Jak można bezpiecznie obsługiwać sympatię/nielubienie lub przerzucanie/pobieranie z dołu? wypisać w przypadku uwierzytelnienia, potwierdzić wzrost/spadek o jeden, jeśli użytkownik nie zmodyfikował tego wcześniej? Jak by to działało? Czy musi istnieć lista dzieci osób, które to zredagowały? Ciekawi mnie właśnie ten konkretny przypadek użycia, ponieważ wydaje się dość powszechny w wielu aplikacjach, ale wydaje mi się, że byłoby to naprawdę skomplikowane do wdrożenia w firebase?

Odpowiedz

8

1. Nie można edytować ale Kasowalne przez autora

".write": "!data.exists() || (!newData.exists() && data.child('author') === auth.id)" 

2. upodobań/Upvoting

Na kliencie, należy użyć transakcji, który pozwala zwiększyć wartość bezpiecznie :

ref.transaction(function(currentValue) { 
    return (currentValue||0)+1; 
}, function(error) { 
    if(error) /* failed too many times */ 
    else /* it worked */ 
}); 

Bezpieczeństwo to al tak prosta:

".validate": "newData.isNumber() && newData.val() === data.val()+1" 

2,5 Zapewnienie unikalnych głosów

Nie jestem pewien, co to znaczy; zapisy nie mogą być edytowane i prawdopodobnie mogłyby, tylko autor byłby w stanie to zrobić; więc tak naprawdę nie rozumiem "zmodyfikowany" w tym kontekście: "jeśli użytkownik nie zmodyfikował tego wcześniej? Jak to działa?"

Aby zapewnić, że głosy są niepowtarzalne, po prostu przechowujesz je według identyfikatora użytkownika. Użytkownik może usunąć swój głos, usuwając zapis.

Zaleciłbym przechowywanie ich na osobnej ścieżce niż iskry i utrzymywanie prostego przyrostu (wiadomości, które są poddawane głosowaniu w górę/w dół), ponieważ nie ma potrzeby pobierania całej listy wyborców czas przynieś iskrę.

Zasady zabezpieczeń będzie wyglądać tak:

"votes": { 
    "$spark_id": { 
     "$vote": { 
      ".read": "$vote === auth.id", 
      ".write": "$vote === auth.id", 
      // to allow downvoting in addition to up or delete, just add -1 here 
      ".validate": "newData.val() === 1 || newData.val() === null" 
     } 
    } 
} 

A teraz dodać czek od reguły sprawdzania poprawności dla przyrostu:

".validate": "!root.child('votes').child($spark_id).child(auth.id).exists() && newData.isNumber() && newData.val() === data.val()+1" 
+0

Bardzo dziękuję za odpowiedź, że zasada zapisu jest czystą sztuką w moich oczach i przepraszam za to, że nie byłem wystarczająco jasny z "zmodyfikowanym" bitem. Uaktualnianie, zaimplementowane w opisany sposób, pozwoliłoby użytkownikowi na niekończące się przesyłanie postu, podczas gdy zwykle taka funkcjonalność jest ograniczona do jednego na użytkownika. Byłem więc ciekawy, jak pozwoliłoby się użytkownikowi tylko raz zagrać, nie pozwolić na dwukrotne awansowanie, ale usuńcie głosowanie i głosowanie. Rozumiem, w jaki sposób osiągnęłbym to w relacyjnej bazie danych, po prostu ciekawy, jaki jest najlepszy sposób na zrobienie tego w bazie ogniowej. – Kirill

+0

Mam to już wdrożone dla naszej wersji beta; to jest prostsze niż myślisz; pozwól mi to dodać. – Kato

+0

Proszę bardzo, daj mi znać, jeśli coś z tego jest niejasne. – Kato

0

Teraz, Firebase Funkcje została wydana (w wersji beta) do ogółu społeczeństwa, wydaje się dobrym rozwiązaniem: https://firebase.googleblog.com/2017/03/introducing-cloud-functions-for-firebase.html

Chodzi o to, aby każdy użytkownik mógł dodać swoje nazwisko, kluczem, do "upvoters" col lektura dla tweeta. Mogą tworzyć lub usuwać swoje wpisy - , ale może być tylko jeden, ponieważ jest to klucz, a reguła bezpieczeństwa pozwala tylko kontrolować ich jeden klucz.

Po ustaleniu "liczby uprowadzeń" klient może uzyskać uzyskać pełną listę przebojów i zliczyć numer. Zamiast tego, ze względu na wydajność, tworzymy Funkcję Firebase, która jest uruchamiana za każdym razem, gdy dodawany lub usuwany jest zapis na stronie.

Wszystko to powoduje zwiększenie lub zmniejszenie wartości "upvote count" na tweecie. To jest to samo, co poprzednio, poza tym, że tworzymy regułę bezpieczeństwa, która tylko pozwala funkcji hostowanej w chmurze modyfikować to pole. W związku z tym modyfikacja jest zawsze zaufana i bezpieczna, i eliminuje potrzebę, aby klient otrzymał listę awansów, aby uzyskać liczbę pobrań.