CouchDB的访问控制

本文部分内容来自GITHUB(pouchdb-community/pouchdb-authentication),如有需要可以参照英文原文

Apache的PouchDB在和后端的CouchDB同步时,通常是每一个用户对应一个CouchDB。 PouchDB使用JavaScript在前端连接后端CouchDB数据库,用户名和密码会暴露在前端,如果多用户共享CouchDB时,需要对CouchDB做访问控制,防止前端用户滥用数据。 CouchDB的访问控制通常可以通过一下两种方式实现,

1. CouchDB的安全机制

2. 在企业级部署环境中,通过网关对CouchDB做访问控制

通过CouchDB的安全机制控制可以做如下访问控制

    所有用户都必须登录才能执行任何操作。

    所有用户都可以读写所有数据 。

    所有用户都可以读数据,部分用户可以写所有数据。

    所有用户都可以读数据,部分用户可以写部分数据。

    部分用户可以读写一切数据。

    部分用户可以读数据,另外一部分用户可以编辑数据。

首次安装CouchDB时, CouchDB处于“Admin Party”模式,这意味着每个人都是管理员。创建一个管理员用户,将会禁用此功能。需要指出的是通过官方Docker镜像安装的CouchDB在Docker第一次运行时需要指定CouchDB 服务器的管理员账号和密码,会自动禁用“Admin Party”。关于用Docker部署CouchDB请参照我的简书。请参照以下屏幕截图,创建服务器管理员账号,禁用“Admin Party”

CouchDB支持称为“design document”的数据库中的特殊文档。这些文档是JavaScrip编写的驱动,用于建立索引,验证文档更新,格式化查询结果以及过滤复制。在我的前一篇文章中已经讲述了如何利用design document过滤文档。下文介绍通过design document的validate_doc_update函数控制用户对文档的变更操作。

通过以下指令创建一个新的用户账号

curl -X PUT

http://localhost:5984/_users/org.couchdb.user: pouchclient \

-u admin:password \

-H "Accept: application/json" \

-H "Content-Type: application/json" \

-d '{"name": " pouchclient ", "password": "password", "roles": [“blogger"], "type": "user"}'

上述指令创建了一个用户名为jan的普通用户账号,具有blogger角色。你看在CouchDB中的_users数据库中查看这个新建的账号当然你也可以通过REST工具发送PUT请求创建新的用户账号。

CouchDB数据库访问权限的配置

用浏览器打开CouchDB的管理页面,点击你所有增加访问控制的数据库


把新建的用户账号加入到Members下面的User和Roles目录下,如下图所示

以上配置为CouchDB的数据库的访问权限设置为

    1. pouchclient这个账号可以访问

    2. 具有reader角色的所有账号都可以访问

在数据库中新建一个design document

通过下面的指令创建一个新的desgin document

curl -X POST http://server_admin:password@localhost:5984/todos \

-H 'content-type:application/json' \

-d $'{"_id":"_design/only_bloggers","validate_doc_update":"function (newDoc, oldDoc, userCtx) {\\nvar role = \\"blogger\\";\\nif (userCtx.roles.indexOf(\\"_admin\\") === -1 && userCtx.roles.indexOf(role) === -1) {\\nthrow({forbidden : \\"Only users with role \\" + role + \\" or an admin can modify this database.\\"});\\n}\\n}"}'

上述指令在新建的design document中的关键在于validate_doc_update, 把此函数的JavaScript代码格式化后如下所示。当客户端试图对数据库做增删改操作时,validate_doc_update函数会被执行。该函数校验用户是不是具有blogger角色,如果不具有blogger角色,服务器会返回http 403错误代码,以及设定的提示信息

function(newDoc, oldDoc, userCtx) {

      var role = "blogger";

      if (userCtx.roles.indexOf(role) === -1) {

        throw({forbidden : "Only users with role " + role + "  can modify this database."});

  }

}

通过网关对CouchDB做访问控制

CouchDB API是与CouchDB实例接口的主要方法。使用HTTP发出请求,请求用于从数据库请求信息,存储新数据以及对文档中存储的信息进行查看和格式化。从数据库中检索信息通常由GET操作处理,而更新则由POST或PUT请求处理。

在企业级生产环境中通常使用网关或者反向代理对服务做负载均衡以及访问控制,利用CouchDB的API特性,可以通过在网关上定制化过滤器来对CouchDB的访问做限制,例如设置为阻断所有非http get请求实现对CouchDB的数据库只读访问,可以通过过滤器做更细力度的控制,例如对具体某一个数据库的访问做控制,详细信息可以访问Apache CouchDB官网对API的说明文档

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。