这种方法应该没有问题。
假设您有一个数据库“测试”,并且已经有一个管理员帐户:
curl -X PUT http://localhost:5984/test -u "admin:123"
现在您可以为其创建一个 _security 文档:
curl -X PUT http://localhost:5984/test/_security -u "admin:123" -d '{"admins":{"names":[], "roles":[]}, "readers":{"names":["joe"],"roles":[]}}'
它们只有用户“joe”才能读取数据库。要创建用户,您必须已经拥有 sha1 哈希密码:
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"
该用户的密码“123”使用 sha1 和 salt“1” (sha1("123"+"1")) 进行哈希处理,因此他可以读取数据库:
curl -X GET http://localhost:5984/test -u "joe:123"
他现在可以阅读该数据库上的任何文档,而其他用户(除了他和管理员)不能。
更新:作家安全
上面的方法会出现reader问题,但是这里的reader权限实际上是指“读/写通用文档”,所以它允许写除design-docs之外的文档。 _security 文档中的“管理员”可以在此数据库中编写设计文档。
另一种方法,取自您自己的答案,是“validate_doc_update”,您可以在文件中有一个 validate_doc_update,如下所示:
function(new_doc, old_doc, userCtx) {
if(!userCtx || userCtx.name != "joe") {
throw({forbidden: "Bad user"});
}
}
并将其推入 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'
他们“joe”可以使用基本身份验证写入数据库:
curl -X PUT http://localhost:5984/test/foobar -d '{"foo":"bar"}' -u 'joe:123'
正如您还提到的,您可以使用 _session api 获取用于身份验证的 cookie:
curl http://localhost:5984/_session -v -X POST -d 'name=joe&password=123' -H "Content-Type: application/x-www-form-urlencodeddata"
这将返回如下标题:
Set-Cookie: AuthSession=am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz; Version=1; Path=/; HttpOnly
因此,您可以在您的下一个请求中包含 cookie“AuthSession=am9lOjRDRDE1NzQ1Oj_xIexerFtLI6EWrBN8IWYWoDRz”,它们将通过身份验证。