面试题答案
一键面试基本概念
- 用户与角色:
- CouchDB支持定义不同的用户,每个用户可以被赋予特定的角色。角色是一组权限的集合,通过将角色分配给用户,可以批量管理用户权限。例如,可以定义“admin”角色具有对所有文档的完全读写权限,而“readonly”角色只有读取权限。
- 文档级权限:
- 除了基于用户和角色的全局权限,CouchDB还支持文档级别的权限设置。这意味着可以针对特定的文档或文档集合,设置不同用户或角色的读写权限。例如,某些敏感文档可能只允许特定用户组访问。
- 冲突文档:
- 在分布式系统中,当多个副本同时对同一文档进行修改时,会产生冲突文档。CouchDB会将这些冲突版本都保留,需要通过特定机制来决定最终采用哪个版本。权限管理在冲突解决场景下,决定了哪些用户可以参与冲突解决过程,以及对冲突文档的不同操作权限。
操作机制
- 设置用户权限:
- 通过配置文件:在CouchDB的配置文件(
local.ini
)中,可以设置管理员用户。例如:
[admins] myadmin = mypassword
- 使用API:可以使用CouchDB的REST API来创建和管理用户。例如,通过
/_users
数据库创建用户:
curl -X PUT http://localhost:5984/_users/org.couchdb.user:newuser -H "Content-Type: application/json" -d '{"name":"newuser","password":"newpassword","roles":[],"type":"user"}'
- 通过配置文件:在CouchDB的配置文件(
- 设置角色权限:
- 设计文档方式:在设计文档中,可以通过
_security
对象设置角色权限。例如:
这里“admin”角色有读写权限,“readonly”角色只有读权限。{ "_id": "_design/mydesign", "_security": { "admins": { "names": [], "roles": ["admin"] }, "readers": { "names": [], "roles": ["admin", "readonly"] } }, "views": { "myview": { "map": "function(doc) { emit(doc._id, doc); }" } } }
- 设计文档方式:在设计文档中,可以通过
- 文档级权限设置:
- 在文档本身添加权限信息。例如:
这表示“user1”和“role1”中的用户可以读取该文档,“user2”和“role2”中的用户可以写入该文档。{ "_id": "mydoc", "data": "Some data", "_security": { "read": ["user1", "role1"], "write": ["user2", "role2"] } }
- 冲突文档权限管理:
- 对于冲突文档,权限管理与普通文档类似。具有读写权限的用户可以查看和处理冲突文档。例如,管理员用户通常具有对所有冲突文档的处理权限,可以决定保留哪个版本。而普通用户如果具有相应文档的读写权限,也可以参与冲突解决,如选择他们认为正确的版本。CouchDB通过
_conflicts
字段标记冲突文档,权限控制决定了哪些用户可以访问和操作这个字段以及相关的冲突版本。
- 对于冲突文档,权限管理与普通文档类似。具有读写权限的用户可以查看和处理冲突文档。例如,管理员用户通常具有对所有冲突文档的处理权限,可以决定保留哪个版本。而普通用户如果具有相应文档的读写权限,也可以参与冲突解决,如选择他们认为正确的版本。CouchDB通过