MST

星途 面试题库

面试题:CouchDB中如何通过HTTP API为不同用户角色设置查询文档的权限控制

假设你有一个CouchDB数据库,其中有普通用户和管理员用户两类角色。普通用户只能查询自己创建的文档,管理员用户可以查询所有文档。请阐述如何通过CouchDB的HTTP API来实现这样的查询文档权限控制,包括涉及到的关键配置和API操作步骤。
12.4万 热度难度
数据库CouchDB

知识考点

AI 面试

面试题答案

一键面试

关键配置

  1. 用户认证与角色设置
    • 使用CouchDB的内置用户认证机制。可以通过_users数据库来管理用户。在创建用户时,为普通用户分配normal_user角色,为管理员用户分配admin_user角色。例如,创建用户的HTTP请求(假设使用curl):
    curl -X PUT -H "Content-Type: application/json" -d '{"name": "normal_user1", "password": "password1", "roles": ["normal_user"], "type": "user"}' http://localhost:5984/_users/org.couchdb.user:normal_user1
    curl -X PUT -H "Content-Type: application/json" -d '{"name": "admin_user1", "password": "password2", "roles": ["admin_user"], "type": "user"}' http://localhost:5984/_users/org.couchdb.user:admin_user1
    
  2. 文档设计
    • 在文档中添加一个字段,比如created_by,用于记录创建文档的用户。当普通用户创建文档时,将自己的用户名写入这个字段。例如,一个普通用户创建文档的请求:
    curl -X POST -H "Content-Type: application/json" -d '{"title": "My Document", "created_by": "normal_user1"}' -u normal_user1:password1 http://localhost:5984/my_database
    
  3. 视图设计
    • 创建一个视图,用于根据created_by字段进行查询。在设计文档中定义视图,例如:
    {
        "_id": "_design/my_design",
        "views": {
            "by_created_by": {
                "map": "function(doc) { if (doc.created_by) { emit(doc.created_by, doc); } }"
            }
        }
    }
    
    • 使用curl上传设计文档:
    curl -X PUT -H "Content-Type: application/json" -d @design_doc.json -u admin_user1:password2 http://localhost:5984/my_database/_design/my_design
    

API操作步骤

  1. 普通用户查询
    • 普通用户只能查询自己创建的文档。利用上述创建的视图,普通用户发起如下查询请求:
    curl -u normal_user1:password1 http://localhost:5984/my_database/_design/my_design/_view/by_created_by?key="normal_user1"
    
    • 这里通过key参数指定只返回created_by字段值为当前普通用户名的文档。
  2. 管理员用户查询
    • 管理员用户可以查询所有文档。管理员用户可直接查询视图,不指定key参数:
    curl -u admin_user1:password2 http://localhost:5984/my_database/_design/my_design/_view/by_created_by
    
    • 这样就会返回数据库中所有文档,因为视图会根据created_by字段索引所有文档,管理员不受特定key值限制。