在 Couchdb 2.1 集群中创建只读和只写用户

Posted

技术标签:

【中文标题】在 Couchdb 2.1 集群中创建只读和只写用户【英文标题】:Create a Read-only and Write-only user in Couchdb 2.1 Cluster 【发布时间】:2019-02-05 15:06:37 【问题描述】:

我最近创建了一个 3 服务器 couchdb 2.1 集群,并正在研究创建一些应用程序安全性。这个想法是有一个只写用户将被提供给需要写入数据库的应用程序和一个只读用户将由从数据库读取的应用程序使用。另一个只读用户将被授予开发人员做开发人员所做的事情。问题是我找不到任何关于这样做的文档。我们以前在旧的 1.6 安装中安装过这个,但这是在我之前设置的。任何指导表示赞赏。

【问题讨论】:

【参考方案1】:

创建只读用户非常简单。您必须在数据库上创建一个仅允许某些角色写入数据库的验证函数。旧的堆栈溢出文章在这里。 CouchDB-wide read-only access rights

只写数据库有点棘手。您必须在数据库前面放置一个代理,该代理只允许访问写入接口并阻止访问读取接口。我有一个项目,我们通过在前面放置一个代理并将其指向 couchdb 上的重写接口来完成此操作。

代理指向

https://couchserver.com/databasename/_design/app/_rewrite

设计文档看起来像


   "_id": "_design/app",
   "rewrites": [
       
           "to": "../../_bulk_docs",
           "from": "/db/_bulk_docs",
           "method": "POST"
       ,
       
           "to": "../../_revs_diff",
           "from": "/db/_revs_diff",
           "method": "POST"
       ,
       
           "to": "../../_local/*",
           "from": "/db/_local/*",
           "method": "GET"
       ,
       
           "to": "../../_local/*",
           "from": "/db/_local/*",
           "method": "POST"
       ,
       
           "to": "../../_local/*",
           "from": "/db/_local/*",
           "method": "PUT"
       ,
       
           "to": "../../../",
           "from": "/",
           "method": "GET"
       ,
       
           "to": "../../fakedb",
           "from": "/",
           "method": "GET"
       ,
       
           "to": "/../../fakedb",
           "from": "/db/*",
           "method": "GET"
       
   ]

这允许我们打开最小的接口,让 pouchdb 将数据从客户端同步到我们的服务器。我们必须添加的最后一点是 pouchdb 的解决方法,它会创建错误,因为它向

发出请求

https://proxyserver.com/db

开始复制时。调用并不是真正必要的,解决方法是在数据库中创建一个返回类似响应的文档。


   "_id": "fakedb",
   "_rev": "1-063ad938e0501105d2f304db16dd4970",
   "db_name": "dbname"

【讨论】:

以上是关于在 Couchdb 2.1 集群中创建只读和只写用户的主要内容,如果未能解决你的问题,请参考以下文章

第六章类属性3提供属性验证只读和只写属性取值和赋值方法的访问修饰符

Go 只读/只写channel

如何在 CouchDB 中创建 Erlang 视图

在 CouchDB 1.0 中创建用户时出错

python 使用python在couchdb中创建一个复制链接

不知道如何在 CouchDB 中创建特定的 MapReduce