Я проводил больше исследований и тестирований, и я хочу подвести итог, куда я попал и что еще не работает для меня.
Прежде всего, извинения за тех, кто читает этоВопрос: я искал способы установить разрешения для людей, чтобы писать, а не читать базу данных.Оказывается, будет большая разница: методы создания «читателя» полностью отличаются от создания «писателя» (этого термина на самом деле не существует, хотя мне интересно, почему).
Вкратце:Вы должны добавить пользователя в базу данных _users, которая представляет собой список пользователей, имеющих доступ к любой базе данных в вашем экземпляре CouchDB.Я смог сделать это, выполнив команду, похожую на:
curl -X PUT http://admin:password@localhost:5984/_users/org.couchdb.user:username -d '{"type":"user", "hashed_password":"2bf184a2d152aad139dc4facd7710ee848c2af27", "name":"username", "roles":[]}'
Обратите внимание, что вам, очевидно, необходимо указать пространство имен пользователя с префиксом "org.couchdb.user".Я использовал метод хэширования Ruby, чтобы получить значение hashed_password:
require 'digest/sha1'
pass_hash = Digest::SHA1.hexdigest(password)
Это позволяет получить в базу данных, по-видимому, действительного пользователя.Следующим шагом будет назначение этого пользователя в качестве «писателя» (ха, вот он снова!) Для новой базы данных, которую я создал.Поэтому я мог бы сделать что-то вроде:
curl -X PUT http://admin:password@localhost:5984/newdatabase
, а затем
curl -X PUT http://admin:password@localhost:5984/newdatabase/_design/security -d @security.json
Этот файл .json содержит функцию Javascript для ключа validate_doc_update, и эта функция выглядит следующим образом:
function(new_doc, old_doc, userCtx) {
if(userCtx.name != username) {
throw({forbidden: "Please log in first."});
}
}
Это окольный путь, но это имеет смысл.Однако сейчас я столкнулся с проблемой: очевидно, переменная userCtx не заполняется, пока пользователь не аутентифицируется. В этой статье предполагается, что все, что вам нужно сделать, это передать учетные данные через HTTP-запрос в специальную базу данных _session, например:
curl -X POST http://username:password@localhost:5984/_session
Я могу сделать это для своего администратора,и userCtx var будет заполнен.Но для моего недавно созданного пользователя это не удается:
$ curl http://org.couchdb.user:username:password@localhost:5984/_session
{"ok":true,"userCtx":{"name":null,"roles":[]},"info":{"authentication_db":"_users","authentication_handlers":["cookie","oauth","default"]}}
Обратите внимание, что хэш userCtx равен нулю.Интересно, вызывает ли проблема то пространство имен?В нем есть чертово двоеточие, так что, может быть, есть некоторая путаница с паролем?Я пытался сделать это без пространства имен, и это не работает вообще;по крайней мере, здесь мой запрос, похоже, попал в базу данных и получил ответ.
Я застрял в этой точке.Если кто-нибудь сможет проверить мои предположения и прогресс до сих пор, я надеюсь, что мы все сможем выяснить, как сделать эту работу.
Спасибо!
Аарон.