我知道 CouchDB 不允许非管理员用户编辑/删除设计文档,但是如何防止他们编辑/删除所有文档?
我能找到的唯一信息是可以使用验证功能设置用户权限。我对如何编写验证函数来执行此操作/验证函数所在的位置有点困惑。它们都在 _users 数据库中吗?
谢谢
我知道 CouchDB 不允许非管理员用户编辑/删除设计文档,但是如何防止他们编辑/删除所有文档?
我能找到的唯一信息是可以使用验证功能设置用户权限。我对如何编写验证函数来执行此操作/验证函数所在的位置有点困惑。它们都在 _users 数据库中吗?
谢谢
这很简单:只需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"}
限制对数据库的访问的另一种方法是配置[couch_httpd_auth]
withrequire_valid_user:true
然后每个请求都必须发送凭据以登录到您的 couchdb。