【发布时间】:2016-09-26 22:40:26
【问题描述】:
我正在使用 Mongoose/MongoDB 创建一个 Web 应用程序来存储将被投票的信息。我将在投票中存储用户名和 IP 地址(以便选民可以根据需要更新/修改他们的投票)。
根本问题:在 Mongoose 架构中安全架构投票的最佳方式是什么?
目前,我的架构如下所示(简化):
var Thing = new Schema({
title: {
type: String
},
creator: {
type: String
},
options: [{
description: {
type: String
},
votes: [{
username: {
type: String
},
ip: {
type: String
}
}]
}]
});
mongoose.model('Thing', Thing);
虽然这使得查询任何给定Thing 的数据库变得超级容易,但出于显而易见的原因,它变得更加安全 - 我不想将用户名和 IP 地址返回给浏览器。
问题是,我不确定哪个是安全地将Thing 数据返回到浏览器的最佳/最不痛苦的方案:
循环遍历
Thing.options中的每个选项,然后子循环遍历Thing.options[i].votes中的每个投票以找到请求数据的用户所投的票,然后删除所有投票以摆脱其他用户数据。这似乎非常耗费资源,但我找不到在子数组中使用 indexOf 的方法(欢迎对此进行指导),即Thing.options.votes.indexOf(username)或类似的东西。将投票信息存储在现有的
User架构中,然后每次我想查询单个Thing时都必须在所有用户中搜索投票数据并将其粘贴在一起。这似乎也效率低下/更耗费资源/比必要的更复杂。创建一个单独的
Vote架构,以便更方便地存储数据,但随后添加另一个数据库调用(一个用于Thing,一个用于Vote)。
这个问题有些复杂,因为有不同的投票方式,这是最简单的。
研究……为了后代:
This question 解决数据库中的投票问题,但用于关系数据库,而不是 MongoDB/Mongoose。
This question 涉及 Mongoose/Node.js 应用程序架构,但与投票无关。
This NPM Module 向 Mongoose 模式添加投票,但不太符合我的需求。
This post 看起来很有希望,因为作者正在做我在上面第 1 点中描述的事情(参见作者帖子中的清单 13),但他仍然创建了一个嵌套循环,从清单的第 22 行开始13、循环遍历每个选项/选项,然后遍历每个选项/选项的每次投票。
【问题讨论】:
-
"我不想将用户名和 IP 地址返回给浏览器"您为什么会这样认为?您可以对
server.js中的IP 地址执行操作,而不必通过res.send()将实际IP 发送到浏览器。 -
当我向用户发送特定于投票的详细信息时,当前架构会将所有其他用户数据发送给他们......我真的不希望任何人访问我的用户的用户名和IP 地址。