No debería haber ningún problema con ese enfoque.
Digamos que usted tiene una "prueba" de base de datos, y tienen una cuenta de administrador ya:
curl -X PUT http://localhost:5984/test -u "admin:123"
Ahora puede crear un documento _security para ello:
curl -X PUT http://localhost:5984/test/_security -u "admin:123" -d '{"admins":{"names":[], "roles":[]}, "readers":{"names":["joe"],"roles":[]}}'
ellos sólo el usuario " joe "podrá leer la base de datos. Para crear el usuario debe tener ya el SHA1 hash de la contraseña:
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"
Este usuario tiene la contraseña "123" hash utilizando SHA1 con sal "1" (SHA1 ("123" + "1")), por lo él puede leer la base de datos:
curl -X GET http://localhost:5984/test -u "joe:123"
puede leer cualquier documento ahora en esa base de datos, y ningún otro usuario (pero él y administrador) puede.
ACTUALIZADO: la seguridad escritor
El método anterior emite el problema lector, pero el permiso lector de aquí en realidad significa "leer/escribir documentos comunes", lo que permite escribir documentos, excepto para el diseño de documentos. Los "administradores" en el documento de seguridad pueden escribir do design-docs en esta base de datos.
El otro enfoque, como toma de su propia respuesta, es el "validate_doc_update", que puede tener un validate_doc_update como seguimiento en un archivo:
function(new_doc, old_doc, userCtx) {
if(!userCtx || userCtx.name != "joe") {
throw({forbidden: "Bad user"});
}
}
y empujarlo en un diseño 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'
ellos "Joe" se puede escribir en la base de datos mediante la autenticación básica:
curl -X PUT http://localhost:5984/test/foobar -d '{"foo":"bar"}' -u 'joe:123'
A medida que también se dirigió puede utilizar la API _SESSION para obtener una cookie de autenticación:
curl http://localhost:5984/_session -v -X POST -d 'name=joe&password=123' -H "Content-Type: application/x-www-form-urlencodeddata"
Esto devolverá una cabecera como:
Set-Cookie: AuthSession=am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz; Version=1; Path=/; HttpOnly
Por lo que puede incluir la cookie "AuthSession = am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz" en sus próximas solicitudes y serán autenticados.
Hola Aaron, ¿cómo lograr la creación de una nueva base de datos cada vez que un usuario se ha registrado? ¿Usaste otro nivel, como php, node, ruby? ¿O descubriste una forma pura de couchapp? – Costa