MST

星途 面试题库

面试题:CouchDB HTTP API删除文档权限在复杂场景下的实现

假设在一个多用户、多角色的CouchDB应用场景中,不同角色对文档删除有不同权限,如何通过HTTP API及相关配置实现这种复杂的删除文档权限保障?请举例说明。
45.3万 热度难度
数据库CouchDB

知识考点

AI 面试

面试题答案

一键面试
  1. 使用CouchDB安全配置
    • 角色和用户定义
      • 在CouchDB的_users数据库中定义用户和角色。例如,创建一个管理员角色admin_role和普通用户角色regular_user_role。在_users数据库中创建用户文档,如org.couchdb.user:admin_user,其中包含roles字段设置为["admin_role"],类似地创建org.couchdb.user:regular_userroles字段设置为["regular_user_role"]
    • 数据库权限配置
      • 通过向数据库的_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_idcreator字段与该用户的用户名匹配,发送相同的HTTP DELETE请求,验证函数会允许删除;否则会拒绝删除操作。