我正在尝试为配置文件数据库建模,其中每个配置文件对于经过身份验证的用户都是公开的,并且每个用户只能更新他/她自己的配置文件。
每个个人资料文档_id
都是注册用户的电子邮件,我模拟了以下validate_doc_update
功能:
function(newDoc, oldDoc, userCtx, secObj) {
var id = userCtx.roles[0].substring(5);
if (newDoc._id !== id) {
throw({forbidden: "One can only update one's self document."});
}
}
我测试了数据库,它完全按照我的预期工作。我说得对吗?是否有任何缺陷或漏洞?
(我正在使用SuperLogin创建并登录用户)
答案 0 :(得分:1)
是的,这是一个可行的解决方案。我要检查角色前缀是否为" user:"为了安全起见,也许你也可以允许用户担任角色" _admin"编辑任何文件。
您的解决方案可能存在的一个问题可能是,如果您使用电子邮件作为ID,则可能会公开所有用户的电子邮件地址。但是,如果您在特定用例中对此表示满意,那么您的解决方案就可以了。
答案 1 :(得分:0)
这里的关键是SuperLogin。它在_users
数据库中创建一个文档来表示给定用户的会话。
当用户登录时,SuperLogin creates a new session会插入如下所示的文档:
{
"_id": "org.couchdb.user:iwn9IpwNR4i0wrxmYcGarg",
"_rev": "1-0f36c9e220c41fe54726cdd01adcdcf2",
"password_scheme": "pbkdf2",
"iterations": 10,
"type": "user",
"name": "iwn9IpwNR4i0wrxmYcGarg",
"user_id": "aasaaaaaaaaaaaaaaaaaaaandremiramor@gmail.com",
"expires": 1458027109739,
"roles": [
"user:aasaaaaaaaaaaaaaaaaaaaandremiramor@gmail.com",
"user"
],
"derived_key": "9a6cfaaac2249ef74fba599c3fbede65a48dcd32",
"salt": "1ef2689337699061b9460f6f68f63f28"
}
roles
数组也由SuperLogin使用用户名创建。由于我已将其配置为使用电子邮件作为用户名({emailUsername: true}
),因此电子邮件可以与相应的文档_id
匹配。