Non ci dovrebbero essere problemi con quell'abuso.
Diciamo che si dispone di un "test" del database, e hanno un account amministratore già:
curl -X PUT http://localhost:5984/test -u "admin:123"
Ora è possibile creare un documento _Sicurezza per esso:
curl -X PUT http://localhost:5984/test/_security -u "admin:123" -d '{"admins":{"names":[], "roles":[]}, "readers":{"names":["joe"],"roles":[]}}'
loro solo l'utente " joe "sarà in grado di leggere il database. Per creare l'utente è necessario avere già la sha1 password con hash:
curl -X POST http://localhost:5984/_users -d '{"_id":"org.couchdb.user:joe","type":"user","name":"joe","roles":[],"password_sha":"c348c1794df04a0473a11234389e74a236833822", "salt":"1"}' -H "Content-Type: application/json"
Questo utente ha la password "123" hash usando SHA1 con il sale "1" (sha1 ("123" + "1")), in modo da può leggere il database:
curl -X GET http://localhost:5984/test -u "joe:123"
Sa leggere qualsiasi documento ora in quel database, e nessun altro utente (ma lui e admin) può.
AGGIORNAMENTO: la sicurezza Writer
Il metodo di cui sopra emette il problema lettore, ma il permesso lettore di qui in realtà significa "leggere/scrivere documenti comuni", in modo da permette di scrivere documenti, tranne per il design-docs. Gli "admin" nel documento _security sono autorizzati a scrivere do design-docs in questo database.
L'altro approccio, come preso dalla propria risposta, è il "validate_doc_update", si può avere una validate_doc_update come seguire in un file:
function(new_doc, old_doc, userCtx) {
if(!userCtx || userCtx.name != "joe") {
throw({forbidden: "Bad user"});
}
}
e spingerlo in un disegno CouchDB:
curl -X PUT http://localhost:5984/test/_design/security -d "{ \"validate_doc_update\": \"function(new_doc,doc,userCtx) { if(userCtx || userCtx.name != 'joe') {throw({forbidden: 'Bad user'})}}\"}" --user 'admin:123'
Loro "Joe" può scrivere al database utilizzando l'autenticazione di base:
curl -X PUT http://localhost:5984/test/foobar -d '{"foo":"bar"}' -u 'joe:123'
Come anche lei si è rivolto è possibile utilizzare l'API _SESSION per ottenere un cookie per l'autenticazione:
curl http://localhost:5984/_session -v -X POST -d 'name=joe&password=123' -H "Content-Type: application/x-www-form-urlencodeddata"
Ciò restituirà un colpo di testa come:
Set-Cookie: AuthSession=am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz; Version=1; Path=/; HttpOnly
Quindi è possibile includere il cookie "AuthSession = am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz" nelle tue prossime richieste e saranno autenticati.
Hey Aaron, come hai fatto a realizzare la creazione di un nuovo database ogni volta che un utente registrato? Hai usato un altro livello, come php, node, ruby? O hai scoperto un modo di couchapp puro? – Costa