Ich habe mehr Forschung und Tests gemacht, und ich möchte zusammenfassen, wo ich hingekommen bin, und was immer noch nicht funktioniert für mich.
Zunächst einmal, Entschuldigung für diejenigen, die diese Frage gelesen: Ich suchte nach Möglichkeiten, Berechtigungen für Menschen zu schreiben, nicht zu lesen, die Datenbank. Es stellt sich heraus, dass es ein großer Unterschied ist: Die Techniken zum Erstellen eines "Lesers" sind völlig anders als das Erstellen eines "Schreibers" (dieser Begriff existiert eigentlich nicht, obwohl ich mich frage warum).
Kurz gesagt: Sie müssen der _users-Datenbank einen Benutzer hinzufügen, der eine Liste der Benutzer enthält, die Zugriff auf eine beliebige Datenbank in Ihrer CouchDB-Instanz haben. Ich war in der Lage, das zu tun, indem Sie einen Befehl ähnlich Ausgabe:
curl -X PUT http://admin:[email protected]:5984/_users/org.couchdb.user:username -d '{"type":"user", "hashed_password":"2bf184a2d152aad139dc4facd7710ee848c2af27", "name":"username", "roles":[]}'
Hinweis Sie müssen offenbar mit dem „org.couchdb.user“ Präfix den Benutzernamen Namespace. Ich habe ein Ruby-Hashing-Verfahren den hashed_password Wert zu erhalten:
require 'digest/sha1'
pass_hash = Digest::SHA1.hexdigest(password)
Dieses eine scheinbar gültige Benutzer in die Datenbank erhält. Der nächste Schritt ist, diesen Benutzer als "Writer" (ha, da ist es wieder!) Für die neue Datenbank, die ich erstellt habe, zuzuweisen. So könnte ich so etwas wie:
curl -X PUT http://admin:[email protected]:5984/newdatabase
und dann
curl -X PUT http://admin:[email protected]:5984/newdatabase/_design/security -d @security.json
Die .json Datei eine Javascript-Funktion für den "validate_doc_update" Schlüssel enthält, und diese Funktion wie folgt aussieht:
function(new_doc, old_doc, userCtx) {
if(userCtx.name != username) {
throw({forbidden: "Please log in first."});
}
}
Es ist Kreisverkehr, aber es macht Sinn. Jetzt stoße ich jedoch auf ein Problem: scheinbar wird die userCtx-Variable nicht gefüllt, bis der Benutzer authentifiziert ist. This article schlägt vor, dass alles, was Sie tun müssen, ist die Anmeldeinformationen über eine HTTP-Anforderung an eine spezielle _SESSION Datenbank übergeben, etwa so:
curl -X POST http://username:[email protected]:5984/_session
Ich kann für mein Admin-Benutzer tun, und die userCtx var wird aufgefüllt werden.Aber für meine neu erstellte Benutzer, es scheitert:
$ curl http://org.couchdb.user:username:[email protected]:5984/_session
{"ok":true,"userCtx":{"name":null,"roles":[]},"info":{"authentication_db":"_users","authentication_handlers":["cookie","oauth","default"]}}
Notiere die userCtx Hash null ist. Ich frage mich, ob dieses Namespace-Ding das Problem verursacht? Es hat einen verdammten Doppelpunkt, vielleicht gibt es also etwas Verwirrung über das Passwort? Ich habe versucht, es ohne den Namensraum zu machen, und es funktioniert überhaupt nicht; zumindest hier scheint meine Anfrage die Datenbank zu treffen und eine Antwort zu bekommen.
Ich bin an diesem Punkt fest. Wenn jemand meine Vermutungen und Fortschritte soweit überprüfen kann, hoffe ich, dass wir alle herausfinden können, wie wir das machen können.
Danke!
Aaron.
Hey Aaron, wie haben Sie erreichen bis ein Benutzer unterzeichnet eine neue Datenbank jedes Mal zu schaffen? Hast du eine andere Stufe benutzt, wie PHP, Node, Ruby? Oder hast du einen reinen Couchapp-Weg gefunden? – Costa