您可以通过在 _design 文档中编写 validate_doc_update() 函数来限制写入权限。您可以在official CouchDB documentation中找到详细信息。
例如,此函数会将写入操作限制为仅限管理员:
function(newDoc, oldDoc, userCtx, secObj) {
// allow modifications by admins only.
if ((userCtx.roles.indexOf('_admin') !== -1)) {
return;
}
throw({forbidden: 'You are not allowed to edit public documents.'});
}
将其放入 _design/readonly 文档(或您想要的设计文档的任何名称),并将函数命名为 validate_doc_update。
每个设计文档只能有一个 validate_doc_update 函数,但你当然可以定义多个设计文档。每当任何人尝试写入操作时,文档都会按顺序发送到所有这些验证功能。如果任何函数抛出错误,更新将被拒绝。
因此请注意不要将此设计文档复制到普通用户应该能够写入的数据库中!
据我所知,常规复制仍然有效,因为验证函数不会针对复制检查点文档执行(它们具有特殊的 /_local/ 前缀)。但是你应该明确地尝试一下。
性能影响:
每次发生文档写入时都会执行验证功能,即使是管理员写入,也适用于复制。根据您的应用程序,您可能会考虑一些特殊的复制策略以提高性能。
不过,您描述的设置应该不会造成问题:用户不允许写入,因此如果他们遇到慢速复制到您的公共数据库也没关系。如果您的公共数据库很少更新,也不应该有任何性能问题。
希望我能帮上忙!