Я проводил больше исследований и испытаний, и я хочу обобщить, где я пришел, и что еще не работает для меня.
Во-первых, извиняюсь за тех, кто читает этот вопрос: Я искал способы установить разрешения для людей, чтобы писать, а не читать, базу данных. Оказывается, будет большая разница: методы создания «читателя» полностью отличаются от создания «писателя» (этот термин на самом деле не существует, хотя мне интересно, почему).
Вкратце: вы должны добавить пользователя в базу данных _users, которая представляет собой список пользователей, имеющих доступ к любой базе данных вашего экземпляра CouchDB. Я был в состоянии сделать это, выполнив команду, подобную:
curl -X PUT http://admin:[email protected]: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:[email protected]:5984/newdatabase
, а затем
curl -X PUT http://admin:[email protected]: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 не заполняется до тех пор, пока пользователь не будет аутентифицирован. This article предполагает, что все, что вам нужно сделать, это передать полномочия через запрос HTTP в специальную базу данных _SESSION, например, так:
curl -X POST http://username:[email protected]:5984/_session
я могу сделать это для моего администратора пользователя, и вар userCtx будет заполняться.Но для моего вновь созданного пользователя он не работает:
$ 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"]}}
Обратите внимание, что hash hasC пользователя hast null. Интересно, вызывает ли это пространство имен проблему? В нем есть двоеточие, так что, может быть, есть некоторая путаница в пароле? Я пробовал сделать это без пространства имен, и он вообще не работает; по крайней мере, здесь мой запрос попадает в базу данных и получает ответ.
Я застрял в этой точке. Если кто-то может проверить мои предположения и прогресс до сих пор, я надеюсь, что мы все можем понять, как это сделать.
Спасибо!
Aaron.
Эй Аарон, как вы добились создания новой базы данных каждый раз, когда пользователь подписался? Вы использовали другой уровень, например php, node, ruby? Или вы поняли путь чистого кучаппа? – Costa