面试题答案
一键面试- 使用CouchDB安全配置
- 角色和用户定义:
- 在CouchDB的
_users
数据库中定义用户和角色。例如,创建一个管理员角色admin_role
和普通用户角色regular_user_role
。在_users
数据库中创建用户文档,如org.couchdb.user:admin_user
,其中包含roles
字段设置为["admin_role"]
,类似地创建org.couchdb.user:regular_user
,roles
字段设置为["regular_user_role"]
。
- 在CouchDB的
- 数据库权限配置:
- 通过向数据库的
_security
文档写入权限信息来控制访问。例如,对于my_database
数据库,发送一个HTTP PUT请求到http://localhost:5984/my_database/_security
(假设CouchDB运行在本地5984端口),请求体如下:
- 通过向数据库的
- 角色和用户定义:
{
"admins": {
"names": [],
"roles": ["admin_role"]
},
"members": {
"names": [],
"roles": ["regular_user_role"]
}
}
- 这样,具有`admin_role`角色的用户就有数据库的管理员权限(包括删除文档),而具有`regular_user_role`角色的用户只有成员权限。
2. 利用文档级别的安全机制
- 设计文档和验证函数:
- 创建一个设计文档,例如
_design/security
,在其中定义一个验证函数。发送一个HTTP PUT请求到http://localhost:5984/my_database/_design/security
,请求体如下:
- 创建一个设计文档,例如
{
"validate_doc_update": "function(newDoc, oldDoc, userCtx) {
if (userCtx.roles.indexOf('admin_role')!== -1) {
return true;
}
if (userCtx.roles.indexOf('regular_user_role')!== -1) {
// 普通用户只能删除自己创建的文档,假设文档中有一个creator字段
if (newDoc._deleted && newDoc.creator === userCtx.name) {
return true;
}
return false;
}
return false;
}"
}
- 示例操作:
- 当一个具有
admin_role
角色的用户想要删除文档时,发送一个HTTP DELETE请求到http://localhost:5984/my_database/{doc_id}?rev={rev_id}
,验证函数会允许删除操作,因为该用户具有管理员角色。 - 当一个具有
regular_user_role
角色的用户想要删除文档时,假设文档doc_id
的creator
字段与该用户的用户名匹配,发送相同的HTTP DELETE请求,验证函数会允许删除;否则会拒绝删除操作。
- 当一个具有