Il ne devrait pas y avoir de problème avec cette approche.
Disons que vous avez une base de données « test », et ont un compte administrateur déjà:
curl -X PUT http://localhost:5984/test -u "admin:123"
Maintenant, vous pouvez créer un document de _security pour elle:
curl -X PUT http://localhost:5984/test/_security -u "admin:123" -d '{"admins":{"names":[], "roles":[]}, "readers":{"names":["joe"],"roles":[]}}'
Eux seul l'utilisateur " Joe "sera en mesure de lire la base de données. Pour créer l'utilisateur que vous devez avoir le SHA1 mot de passe haché:
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"
Cet utilisateur le mot de passe « 123 » haché en utilisant SHA1 avec du sel « 1 » (SHA1 (« 123 » + « 1 »)), donc il peut lire la base de données:
curl -X GET http://localhost:5984/test -u "joe:123"
il peut lire tout document maintenant sur cette base de données, et aucun autre utilisateur (mais lui et admin) peut.
MISE À JOUR: Writer sécurité
La méthode ci-dessus délivre le problème du lecteur, mais l'autorisation de lecteur ici signifie en fait « lecture/écriture docs commun », il permet d'écrire docs sauf pour la conception-docs. Les "admin" dans le document _security sont autorisés à écrire des documents de conception dans cette base de données.
L'autre approche, comme pris de votre propre réponse, est le « validate_doc_update », vous pouvez avoir un validate_doc_update comme suivre dans un fichier:
function(new_doc, old_doc, userCtx) {
if(!userCtx || userCtx.name != "joe") {
throw({forbidden: "Bad user"});
}
}
et le pousser dans une conception de 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'
Them "Joe" peut écrire à la base de données en utilisant l'authentification de base:
curl -X PUT http://localhost:5984/test/foobar -d '{"foo":"bar"}' -u 'joe:123'
Comme vous également adressé, vous pouvez utiliser l'api _session pour obtenir un cookie pour l'authentification:
curl http://localhost:5984/_session -v -X POST -d 'name=joe&password=123' -H "Content-Type: application/x-www-form-urlencodeddata"
Cela renverra un en-tête comme:
Set-Cookie: AuthSession=am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz; Version=1; Path=/; HttpOnly
Vous pouvez inclure le cookie « AuthSession = am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz » dans vos prochaines demandes et ils seront authentifiés.
Hey Aaron, comment avez-vous accomplissez la création d'une nouvelle base de données chaque fois qu'un utilisateur inscrit? Avez-vous utilisé un autre niveau, comme php, node, ruby? Ou avez-vous trouvé un moyen de couchage pur? – Costa