2013-04-25 18 views
5

Wiem, że CouchDB nie zezwala użytkownikom nieadministracyjnym na edytowanie/usuwanie dokumentów projektowych, ale w jaki sposób uniemożliwić im edycję/usuwanie wszystkich dokumentów?Jak uniemożliwić anonimowym użytkownikom usuwanie/edytowanie moich dokumentów w couchDB?

Jedyne informacje, jakie mogłem znaleźć to to, że uprawnienia użytkownika można ustawić za pomocą funkcji sprawdzania poprawności. Jestem trochę zdezorientowany, w jaki sposób napisałbym funkcję sprawdzania poprawności, aby to zrobić/gdzie funkcje sprawdzania poprawności działają na żywo. Czy wszyscy są w DB?

Dzięki

Odpowiedz

4

To proste: wystarczy utworzyć dokument projektowe z validate_doc_update funkcji w bazie danych, gdzie chcesz kontrolować dokumenty, które robi coś takiego:

function(newDoc, oldDoc, userCtx, secObj){ 
    if('_admin' in userCtx.roles) return; // skip anonymous in Admin Party case; 
    if(!userCtx.name && newDoc._deleted){ 
     throw({'forbidden': 'auth first before delete something'}); 
    } 
} 

Pomysł jest prosty: jeśli userCtx nie ma podanej nazwy, oznacza to, że użytkownik jest anonimowy i jeśli nasza nowa wersja dokumentu ma specjalne pole _deleted ustawione jako true - dokument zostanie usunięty (ale zmiany nie zostaną jeszcze zapisane na dysku). Sprawdzamy więc te pola i wyrzucamy niedozwolony wyjątek, jeśli warunek został spełniony. Zrobimy również wyjątek dla przypadku strony administratora, gdzie wszyscy są bezimienni, ale mają rolę _admin, więc musimy je pominąć. A teraz na każdej próbie usunięcia zwykłego dokumentu przez anonimowy użytkownik otrzyma kolejną odpowiedź http:

HTTP/1.1 403 Forbidden 
Server: CouchDB/1.3.0 (Erlang OTP/R15B03) 
Date: Thu, 25 Apr 2013 18:48:51 GMT 
Content-Type: application/json 
Content-Length: 68 
Cache-Control: must-revalidate 

{"error":"forbidden","reason":"auth first before delete something"} 
+0

Dziękujemy! Bardzo pomocna odpowiedź! –

6

Innym sposobem, aby ograniczyć dostęp do bazy danych jest konfiguracja [couch_httpd_auth] z require_valid_user:true

Następnie każdy wniosek musi wysłać dane logowania do twojego couchdb.

+2

Dla mojego przypadku użycia, jest to znacznie prostsze i bardziej skuteczne niż zaakceptowana odpowiedź. Moim celem było zablokowanie ** całego ** anonimowego dostępu, a nie tylko konkretnych działań przeciwko konkretnym dokumentom. Ta odpowiedź to robi. – aroth