我知道CouchDB不允许非管理员用户编辑/删除设计文档,但如何阻止他们编辑/删除所有文档呢?
我能找到的唯一信息是可以使用验证功能设置用户权限。关于我如何编写验证函数来执行此操作/验证函数的实时性,我有点困惑。它们都在_users DB中吗?
由于
答案 0 :(得分:8)
限制访问数据库的另一种方法是使用[couch_httpd_auth]
配置require_valid_user:true
然后每个请求都必须发送凭据才能登录到您的couchdb。
答案 1 :(得分:7)
这很简单:只需在数据库中创建带有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
个角色,所以我们需要跳过它们。现在,在任何匿名用户删除常规文档的尝试中,他都会收到下一个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"}