CouchDB Autorisation sur une base Par Base de données
Je travaille sur une application soutenus par CouchDB. Essentiellement, je veux créer une base de données pour chaque utilisateur de mon application. Pour ce faire, l'utilisateur admin de créer la base de données, mais à l'avenir, l'utilisateur a besoin d'accéder à leur base de données (à l'aide de HTTP Auth sur SSL). J'ai eu un sacré bout de temps à essayer de comprendre cela.
La meilleure ressource que j'ai trouvé est dans le CouchDB wiki, sur ce lien:
http://wiki.apache.org/couchdb/Security_Features_Overview#Authorization
Il suggère que vous pouvez définir par la base de données de l'autorisation, par la création d'un document appelé "_security", à laquelle vous ajoutez une table de hachage de les admins et les lecteurs. Lorsque je tente de créer ce document, j'obtiens le message de retour est "Mauvais document spécial membre: _security".
$ curl -X GET http://localhost:5984
{"couchdb":"Welcome","version":"1.0.1"}
Toute aide serait appréciée!
Acclamations,
Aaron.
- Hey Aaron, comment avez-vous fait de la création d'une nouvelle base de données chaque fois qu'un utilisateur inscrit? Avez-vous utilisé un autre niveau, comme php, nœud, ruby? Ou avez-vous trouver un pur couchapp façon?
Vous devez vous connecter pour publier un commentaire.
Il devrait y avoir aucun problème avec cette approche.
Disons que vous avez une base de données "test", et avoir un compte admin déjà:
Maintenant, vous pouvez créer un _security document pour elle:
Eux seul l'utilisateur "joe" sera en mesure de lire la base de données. Pour créer l'utilisateur, vous devez avoir déjà le sha1 hachage de mot de passe:
Cet utilisateur ont le mot de passe "123" haché en utilisant sha1 avec le sel "1" (sha1("123"+"1")), ainsi il peut lire la base de données:
Il peut lire n'importe quel document de la base de données, et aucun autre utilisateur (mais lui et admin) peut.
Mise à JOUR: Auteur de sécurité
La méthode ci-dessus, les questions que le lecteur problème, mais l'autorisation de lecture ici signifie réellement "lecture/écriture commune docs", de sorte qu'il permet d'écrire des docs à l'exception de conception-docs. La "admin"dans les _security doc sont autorisés à écrire faire de la conception-docs dans cette base de données.
L'autre approche, à partir de votre propre réponse, est la "validate_doc_update", vous pouvez avoir un validate_doc_update comme suit dans un fichier:
Et le pousser dans une couchdb conception:
Eux "joe" peut écrire dans la base de données à l'aide de l'Authentification de Base:
Comme vous l'avez également abordé vous pouvez utiliser le _session api pour obtenir un cookie d'authentification:
Cela renvoie un en-tête comme:
De sorte que vous pouvez inclure le cookie "AuthSession=am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrbn8iwywodrz" dans vos prochaines demandes et il est authentifié.
J'ai fait plus de recherches et de tests, et je tiens à résumer où j'ai appris à, et ce qui ne fonctionne toujours pas pour moi.
Tout d'abord, toutes mes excuses pour ceux qui ont lu cette question: je suis à la recherche de moyens pour définir des autorisations pour les gens à écrire, lire, la base de données. Il s'avère être une grande différence: les techniques pour la création d'un "lecteur" sont totalement différentes de la création d'un "écrivain" (qui en fait n'existe pas, bien que je me demande pourquoi).
En bref: vous devez ajouter un utilisateur à la _users base de données, qui est une liste des utilisateurs qui ont accès à une base de données dans votre instance de CouchDB. J'ai pu le faire que par l'émission d'une commande de ce type:
Remarque vous devez apparemment espace de noms le nom d'utilisateur avec le "org.couchdb.utilisateur" préfixe. J'ai utilisé un Rubis méthode de hachage pour obtenir le hashed_password valeur:
Cela devient apparemment un utilisateur valide dans la base de données. L'étape suivante consiste à attribuer à cet utilisateur comme un "écrivain" (ha, elle est encore là!) pour la nouvelle base de données que j'ai créé. Donc si je peux faire quelque chose comme:
et puis
Que .fichier json contient une fonction Javascript pour la "validate_doc_update" de la clé, et que la fonction ressemble à ceci:
Il du rond-point, mais il est logique. Cependant, je suis confronté à un problème: apparemment, le userCtx variable n'obtenez pas remplie jusqu'à ce que l'utilisateur est authentifié. Cet article suggère que tout ce que vous avez à faire est de transmettre les informations d'identification par le biais d'une requête HTTP à un _session base de données, comme suit:
Je peux le faire pour mon utilisateur admin et le userCtx var sera rempli. Mais pour mon utilisateur nouvellement créé, il échoue:
Note le userCtx de hachage est null. Je me demande si c'espace de noms de la chose est à l'origine du problème? Il a une putain de colon, alors peut-être il ya une certaine confusion sur le mot de passe? J'ai déjà essayé de le faire sans l'espace de noms, et il ne fonctionne pas du tout; au moins ici ma demande semble frapper la base de données et d'obtenir une réponse.
Je suis coincé à ce point. Si quelqu'un peut vérifier mes hypothèses et les progrès accomplis jusqu'à présent, j'espère que nous pouvons tous comprendre comment faire ce travail.
Merci!
Aaron.
curl http://username:password@localhost:5984/_session
et vous devriez obtenir une userCtx objet.Vous voudrez peut-être vérifier Matt Woodward - Le Guide de référence pour CouchDB d'Authentification et de Sécurité http://blog.mattwoodward.com/2012/03/definitive-guide-to-couchdb.html