2012-05-15 27 views
11

Chcę zaimplementować aplikację webapp - plik danych, który integruje dane z różnych źródeł i wyświetla je użytkownikom. Użytkownik powinien widzieć tylko te elementy kanału, które ma uprawnienia do odczytu (np. Dlatego, że należą do projektu, którego jest członkiem). Jednak element kanału może (i będzie) widoczny dla wielu użytkowników.Czy podejście bazy danych CouchDB dla poszczególnych użytkowników jest możliwe dla użytkowników z dużą ilością udostępnianych danych?

Naprawdę chciałbym użyć CouchDB (głównie ze względu na fajne _changes feed i map/reduce views). Zastanawiam się nad wdrożeniem aplikacji jako czystego couchappa, ale mam problem z modelem uprawnień. AFAIK, nie ma żadnych uprawnień dla pojedynczego dokumentu w CouchDB i jest to zwykle implementowane przy użyciu baz danych i replikacji dla poszczególnych użytkowników.

Ale gdy istnieje wiele nakładających się na siebie różnic między użytkownikami, które mogłyby wprowadzić dużo kosztów ogólnych ... rzeczy byłyby replikowane w każdym miejscu i powielane w wielu bazach danych. Podoba mi się elegancja tego podejścia, ale ogromne obciążenie wydaje się po prostu przełomowe ... (Powiedzmy, że mam 50 użytkowników i wszyscy widzą te same dane ...).

Jakieś pomysły na ten temat, proszę? Alternatywne rozwiązanie?

Odpowiedz

7

Można wymusić uprawnienia do odczytu opisane w CouchDB Authorization on a Per-Database Basis.

Aby uzyskać uprawnienia do zapisu, można użyć funkcji sprawdzania poprawności opisanych na stronie CouchDB The Definitive Guide - Security.

Można utworzyć bazę danych dla każdego projektu i wymusić tam uprawnienia, a następnie wszystkie dane są efektywnie współdzielone między użytkownikami. Jeśli użytkownik udostępnia sam plik danych i potrzebuje uprawnień, a Ty możesz wprowadzić użytkownika w "projekt", więc ta sama logika obowiązuje wszędzie.

Za pomocą tego wzoru można autoryzować użytkownika lub grupę użytkowników (role) dla każdego projektu.

+0

Niestety model pozwolenia na projekt nie jest wystarczająco drobnoziarnisty dla moich potrzeb (potrzebuję niektórych użytkowników, aby zobaczyli tylko niektóre elementy należące do określonego projektu). –

4

Inne niż (jak już zasugerował victorsavu3) obsługa twojego autoryzowanego odczytu w proxy między twoją aplikacją a kanapą, są tylko dwie inne alternatywy, które mogę wymyślić.

Po pierwsze, nie obchodzi, dysk jest tani, a posiadanie wielu kopii danych może wydawać się niepotrzebnym duplikowaniem, ale znacznie upraszcza architekturę i zapewnia pewne automatyczne korzyści, takie jak łatwe skalowanie do obsługi obciążenia (po prostu przenosząc niektóre bazy danych użytkowników na inne serwery).

Po drugie, podzielone dane podzielone są na różne bazy danych. Spowoduje to od czasu do czasu ograniczenie czynności, które można wykonać w widokach (np. "Dokumenty połączone"), ale w wielu sytuacjach nie jest to wielka sprawa.

+1

Miejsce na dysku jest tanie - tak, ale w moim przypadku może to ostatecznie spowodować * dużo * miejsca na dysku, więc postanowiłem nie iść tą drogą. Dzielenie DB - myślałem o tym zbyt ... ale wierzę, że to podejście byłoby bardziej złożone niż uruchomienie cienkiego serwera na CouchDB, który obsługuje uwierzytelnianie. –

+0

Tak, to też dobre rozwiązanie. – smathy