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"}
Dziękujemy! Bardzo pomocna odpowiedź! –