2013-04-25 30 views
5

So che CouchDB non consente agli utenti non-admin per modificare/eliminare documenti di progettazione, ma come faccio impedisce di modificare/cancellare tutti i documenti?Come posso impedire agli utenti anonimi di eliminare/modificare i miei documenti in CouchDB?

L'unica informazioni che ho trovato è che le autorizzazioni utente possono essere impostati con funzioni di convalida. Sono un po 'confuso su come scrivere una funzione di convalida per fare questo/dove vivono le funzioni di convalida. Sono tutti nel _user DB?

Grazie

risposta

4

E 'un semplice: basta creare documenti di progettazione con validate_doc_update funzione nel database in cui si desidera controllare i documenti che fa qualcosa di simile:

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'}); 
    } 
} 

L'idea è semplice: se userCtx non ha nome specificato questo significa che l'utente è anonimo e se la nostra nuova versione del documento ha campo speciale _deleted set come true - documento sta per essere cancellato (ma le modifiche non salvate su disco ancora). Quindi controlliamo questi campi e lanciamo un'eccezione vietata se la condizione è soddisfatta. Stiamo anche fare un'eccezione per il caso del partito Admin c'è tutti senza nome, ma ha _admin ruolo, quindi abbiamo bisogno di saltare loro. E d'ora in poi ogni tentativo di cancellare i documenti regolari da utenti anonimi che riceverà il prossimo risposta 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

Grazie! Risposta molto utile! –

6

Un altro modo per limitare l'accesso al database è quello di configurare il [couch_httpd_auth] con require_valid_user:true

Poi ogni richiesta deve inviare credenziali per accedere al tuo divanodb.

+2

Per il mio caso d'uso, questo è molto più semplice ed efficace della risposta accettata. Il mio obiettivo era bloccare ** tutti ** l'accesso anonimo, non solo azioni specifiche contro documenti specifici. Questa risposta lo fa. – aroth

Problemi correlati