7

我知道 CouchDB 不允许非管理员用户编辑/删除设计文档,但是如何防止他们编辑/删除所有文档?

我能找到的唯一信息是可以使用验证功能设置用户权限。我对如何编写验证函数来执行此操作/验证函数所在的位置有点困惑。它们都在 _users 数据库中吗?

谢谢

4

2 回答 2

8

这很简单:只需validate_doc_update在数据库中创建具有功能的设计文档,您希望在其中控制执行以下操作的文档:

function(newDoc, oldDoc, userCtx, secObj){ 
    if('_admin' in userCtx.roles) return; // skip anonymous in Admin Party case;
    if(!userCtx.name && newDoc._deleted){
      throw({'forbidden': 'auth first before delete something'});
    }
}

这个想法很简单:如果userCtx没有指定名称,这意味着用户是匿名的,并且如果我们的新文档版本有特殊字段_deleted设置为true- 文档将被删除(但更改尚未保存在磁盘上)。因此,我们检查这些字段并在满足条件时抛出一个禁止的异常。我们也为 Admin Party 情况例外,每个人都无名,但都有_admin角色,所以我们需要跳过它们。现在,在匿名用户尝试删除常规文档时,他将收到下一个 HTTP 响应:

HTTP/1.1 403 Forbidden
Server: CouchDB/1.3.0 (Erlang OTP/R15B03)
Date: Thu, 25 Apr 2013 18:48:51 GMT
Content-Type: application/json
Content-Length: 68
Cache-Control: must-revalidate

{"error":"forbidden","reason":"auth first before delete something"}
于 2013-04-25T18:51:11.233 回答
8

限制对数据库的访问的另一种方法是配置[couch_httpd_auth]withrequire_valid_user:true

然后每个请求都必须发送凭据以登录到您的 couchdb。

于 2013-08-28T19:04:44.003 回答