security - 基于每个数据库的 CouchDB 授权

标签 security couchdb

我正在开发一个由 CouchDB 支持的应用程序。本质上,我想为我的应用程序的每个用户创建一个数据库。为此,管理员用户将创建数据库,但接下来,用户将需要访问其数据库(使用基于 SSL 的 HTTP 身份验证)。我花了很长时间才弄清楚这个问题。

我找到的最好的资源是在 CouchDB wiki 中,链接如下:

http://wiki.apache.org/couchdb/Security_Features_Overview#Authorization

它建议您可以通过创建一个名为“_security”的文档来设置每个数据库的授权,在该文档中添加管理员和读者的哈希值。当我尝试创建该文档时,收到的消息是“错误的特殊文档成员:_security”。

$ curl -X GET http://localhost:5984
{"couchdb":"Welcome","version":"1.0.1"}

如有任何帮助,我们将不胜感激!

干杯,

亚伦。

最佳答案

这种方法应该没有问题。

假设您有一个数据库“test”,并且已经有一个管理员帐户:

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 和盐“1”进行哈希处理 (sha1(“123”+“1”)),因此他可以读取数据库:

curl -X GET http://localhost:5984/test -u "joe:123"

他现在可以读取该数据库上的任何文档,其他用户(除了他和管理员)都不能。

更新:编写器安全性

上面的方法遇到了读者问题,但这里的读者权限实际上意味着“读/写公共(public)文档”,因此它允许编写除设计文档之外的文档。 _security 文档中的“admin”可以在此数据库中编写设计文档。

另一种方法,取自您自己的答案,是“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”,它们将通过身份验证。

关于security - 基于每个数据库的 CouchDB 授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4055450/

相关文章:

ajax - 如何强制 CouchDB 返回 base64 格式的附件而不是 MIME 多部分/相关的附件?

list - 如何返回我在reduce函数中创建的JSON对象

mysql - 为什么元数据 _id 和 _rev 在值中?

json - couchdb - 信使应用程序中的 json 性能

swift - 使用 Kitura - Swift 保存数据

基于Python的端点代理OSS项目

php - 为什么这容易发生 SQL 注入(inject)?

security - MVC3 安全提示

database - 保护和加密 Multi-Tenancy 云应用程序共享数据库中的数据

python - OS 和 SYS 等容易混淆的 Python 类命名背后的原因?