CouchDB 数据库与用户函数¶
尽管 CouchDB 已作为 Trove 中的实验性数据存储添加,但其功能仍存在一些差距。本规范的动机是在 Trove 中为 CouchDB 数据存储实现一些缺失的用户和数据库函数。
Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/couchdb-database-user-functions
问题描述¶
目前,可以使用 Trove 创建 CouchDB 实例,但功能非常有限。无法通过 Trove CLI 执行任何用户或数据库操作。虽然可以通过访问名为 Futon 的 CouchDB 管理界面 1 执行此类操作,但这不在 Trove 的范围内。因此,为了易用性和一致性,最好将这些 CouchDB 的数据库和用户功能作为 Trove 的一部分来实现。
提议的变更¶
将使用基于 HTTP 的 REST API(CouchDB 使用该 API 与服务器通信)为 Trove 中的 CouchDB 数据存储实现基本用户和数据库函数。将通过 HTTP 请求发送 curl 命令到 CouchDB 服务器,然后执行操作。
将支持的新操作如下
创建/删除/显示用户
列出用户
授予/撤销/显示访问权限
启用/显示 root
创建/删除数据库
列出数据库
将在 service.py 中创建一个 CouchDBAdmin 类,该类将包含这些方法,并且 manager.py 中的函数将被更新为调用这些新方法。每个方法将使用核心 CouchDB API 来对服务器执行适当的 HTTP 请求以实现该功能。
目前,CouchDB 没有 API 扩展,因此将创建一个新的 API 扩展来实现数据存储特定的功能,同时调整用户/数据库操作。CouchDB 特定模型中生效的验证将对应于 CouchDB 数据存储的要求。
CouchDB 安全性¶
在新的 CouchDB 实例上,服务器允许任何人发出任何请求 - 这是一个 Admin Party 2 。为了启用用户功能,来宾代理的 CouchDB 服务器将通过默认创建 Trove 用户 ‘os_admin’ 来保证安全。当首次启动来宾时,将创建 os_admin 用户,并使用来宾生成的密码连接到服务器。这将使用以下命令完成 - curl -X PUT https://:5984/_config/admins/os_admin -d '"password"'
用户名和生成的密码将存储在实例主目录中的文件中(stream_codecs.JsonCodec 将用于处理它)。所有其他创建的用户都是非管理员用户,因此可以防止任何人意外创建管理员用户 3 。可以使用 trove root-enable 命令通过在 couchDB 服务器上创建一个具有管理员权限的用户来创建唯一的管理员用户 ‘root’。
配置¶
无
数据库¶
无
公共 API¶
用户将能够通过 CLI 运行为 CouchDB 数据存储实现的功能。
公共 API 安全¶
无
Python API¶
无
CLI (python-troveclient)¶
以下 Trove 命令行命令将适用于 CouchDB
trove user-create
trove user-delete
trove user-grant-access
trove user-list
trove user-revoke-access
trove user-show
trove user-show-access
trove root-enable
trove root-show
trove database-create
trove database-delete
trove database-list
内部 API¶
无
Guest Agent¶
CouchDB 来宾代理将被修改以支持额外的数据库和用户功能。特别是,以下文件将添加组件
trove/guestagent/datastore/experimental/couchdb/manager.py trove/guestagent/datastore/experimental/couchdb/service.py trove/guestagent/datastore/experimental/couchdb/system.py
将使用 CouchDB API 实现几个新的来宾代理函数。以下是每个来宾代理方法的示例 API 调用和相关详细信息。
create_user
创建非管理员用户,名称为 username,密码为 password
curl -X PUT http://os_admin:password@localhost:5984/_users/org.couchdb .user:username \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name": "username", "password": "password", "roles": [], "type": "user"}'
list_users
列出系统数据库 _users 中的所有用户以及系统数据库 _all_dbs 中的所有数据库。然后交叉引用以列出用户及其拥有的数据库的访问权限。
curl -s http://os_admin:password@localhost:5984/_users/_all_docs
curl -X http://os_admin:password@localhost:5984/_all_dbs
curl -X http://os_admin:password@localhost:5984/databasename/_security
delete_user
从系统数据库 _users 中删除用户 username,对应于 rev 编号 1-3cd11775d7e3ba15a9f8c553cb3d47bd。使用以下第二个命令列出的命令获取文档的 rev 编号。
curl -X DELETE http://os_admin:password@localhost:5984/_users/org. couchdb.user:username?rev=1-3cd11775d7e3ba15a9f8c553cb3d47bd
curl -s http://os_admin:password@localhost:5984/_users/_all_docs
get_user
显示与特定用户相关的所有信息 - 用户名、用户拥有数据库的访问权限以及权限(管理员/成员)。
curl -X http://os_admin:password@localhost:5984/_all_dbs
curl -X http://os_admin:password@localhost:5984/databasename/_security
enable_root
创建用户“root”并授予“admin”角色
curl -X PUT http://os_admin:password@localhost:5984/_config/admins/ root -d '"password"'
is_root_enabled
检查系统数据库 _config 中是否存在 root 用户以及是否具有管理员权限
curl -s http://os_admin:password@localhost:5984/_config/_admins
delete_root
从 CouchDB 实例中删除 root 用户。
curl -X DELETE http:// os_admin:password@localhost:5984/_config/admins/root
grant_access
修改用户 username 在数据库 databasename 上的角色,以将 username 作为列出的管理员包含在内
curl -X PUT http://os_admin:password@localhost:5984 /databasename/_security \ > -d '{"admins":{"names":[], "roles":[]}, "members":{"names”:[ “username”],”roles":[]}}'
revoke_access
与 grant access 的实现类似,修改用户 ` username`` 在数据库 databasename 上的角色,以删除 username 作为列出的成员
curl -X PUT http://os_admin:password@localhost:5984 /databasename/_security \ > -d '{"admins":{"names":[], "roles":[]}, "members":{"names”:[], ”roles":[]}}'
list_access
列出系统数据库 _all_dbs 中的所有数据库。然后交叉引用以列出指定用户具有访问权限的所有数据库。
curl -X http://os_admin:password@localhost:5984/_all_dbs
curl -X http://os_admin:password@localhost:5984/databasename/_security
create_database
创建一个名为 database_name 的数据库
curl -X PUT http://os_admin:password@localhost:5984/database_name
数据库名称必须由以下字符中的一个或多个组成,并且名称必须以小写字母开头 4 。
小写字母 (a-z)
数字 (0-9)
任何字符 _, $, (, ), +, -, 和 /。
delete_database
删除名为 database_name 的数据库
curl -X DELETE http://os_admin:password@localhost:5984/database_name
list_databases
列出系统数据库 _all_dbs 中的所有数据库
curl -X GET http://os_admin:password@localhost:5984/_all_dbs
备选方案¶
无
Dashboard 影响 (UX)¶
需要更新仪表板,以便为 CouchDB 数据存储启用用户和数据库选项卡。无需向仪表板添加新功能。
实现¶
负责人¶
- 主要负责人
imandhan (launchpad id) Ishita Mandhan <imandha@us.ibm.com>
里程碑¶
Mitaka
工作项¶
实现 CouchDB 的用户和数据库功能。主要涉及在 manager、service 和 system 文件上工作。将根据需要编写测试 - 单元测试和集成测试。工作将分为 5 个部分 -
启用服务器上的身份验证
创建/删除/获取/列出用户
启用/检查 root
授予/撤销/列出访问权限
创建/删除/列出数据库
升级影响¶
无
依赖项¶
无
测试¶
将根据需要添加单元测试和集成测试来测试添加的新代码。
文档影响¶
需要更新 CouchDB Trove 文档,以指示已实现用户和数据库功能。
参考资料¶
- 1
CouchDB Futon:http://docs.couchdb.org/en/1.6.1/intro/futon.html
- 2
CouchDB 安全性:http://docs.couchdb.org/en/1.6.1/intro/security.html
- 3
CouchDB 身份验证:http://docs.couchdb.org/en/1.6.1/config/auth.html
- 4
CouchDB 数据库名称限制:http://couchdb-13.readthedocs.org/en/latest/api/database/
附录¶
无