面试题答案
一键面试数据库层面
- 文档设计:在每个文档中添加一个
access
字段,该字段是一个对象,包含不同角色对应的权限信息。例如:
{
"_id": "document1",
"data": "some data",
"access": {
"admin": true,
"user": true,
"guest": true
}
}
- 视图设计:创建视图时,根据
access
字段进行过滤。例如,使用MapReduce视图,在map
函数中根据角色权限决定是否发出数据:
function (doc) {
if (doc.access.admin) {
emit(doc._id, doc);
}
}
这样,通过不同的视图,可以获取不同角色有权限的数据。
应用层
- 用户认证:应用层首先要实现用户身份认证,确定用户的角色(管理员、普通用户、访客)。可以使用常见的认证方式,如JWT(JSON Web Token)。当用户登录时,验证其凭证,生成包含角色信息的JWT。
- 权限验证:在处理查询请求时,从JWT中提取用户角色信息。根据角色信息,决定调用哪个CouchDB视图进行数据查询。例如,如果是管理员角色,调用包含所有数据的视图;如果是普通用户,调用普通用户权限对应的视图;如果是访客,调用仅包含公开数据的视图。
- 分页处理:在应用层实现分页逻辑。在调用CouchDB视图时,通过
limit
和skip
参数来实现分页。例如,对于管理员查询第一页10条数据:
# 使用Python的CouchDB库
import couchdb
couch = couchdb.Server('http://localhost:5984')
db = couch['your_database']
# 假设管理员视图为'admin_view'
view = db.view('admin_view', limit=10, skip=0)
for row in view:
print(row.value)
对于普通用户和访客,类似地调用各自权限对应的视图并进行分页处理。
通过以上从数据库层面到应用层的设计,可以实现复杂权限场景下的查询视图分页安全验证。