如何在 Sails.js 中保护蓝图访问
How to secure blueprint access in Sails.js
所以我对 Sails.js 很陌生,但它似乎给 table 带来了很多,比如这些蓝图,
现在我有 2 个模型,Accounts
/ Friends
它正在使用关联,因为 Accounts
有很多 Friends
在我的客户端,我有一种方法可以向用户发送通知,其中一种是好友请求,这样效果很好,它让用户可以选择接受或拒绝邀请
代码如下:
socket.on('accounts', function(data) {
if (data.verb === "addedTo" && data.attribute === "notifications") {
socket.get('/notifications/' + data.addedId, function(note) {
console.log(note);
if (!$.isEmptyObject(note)) {
$scope.notifications.push({
'text': note.from_name + ' sent you a friends request',
'id': note.id,
'type': note.type,
'from_id': note.from_id
})
$.notify('You have a new notification', 'info');
$scope.$digest();
}
})
}
})
$scope.accept = function(notificationId, fromId) {
}
当人们按下“接受”按钮时,我想为接受通知的人和发送通知的人添加好友,这样他们就可以相互成为好友。
我可以简单地通过创建一个数据对象并为他们两个的朋友做 socket.post
,然后做一个 socket.put
来更新正在读取的通知并处理它
唯一的问题是,我不希望人们进来并打开 JS 控制台和垃圾邮件 socket.post
向人们恶意发送百万朋友
var obj {
'friend_name': 'Bill',
'online': 1
}
socket.post('/accounts/1/friends', obj);
那么,我该如何保护它,以便访问 post
到 /accounts/1/friends
的人只是应该访问它的人?
如果我不明白就问吧。谢谢!
垃圾邮件示例:
有人打开 JS 控制台然后去
var obj = { friend_name: 'bill', owner: 1 }; io.socket.post('/friends', obj);
现在 500 次 id
1 的帐户有 500 个名为 bill
的朋友
如果我误解了什么,请纠正我,但我认为你的逻辑是错误的。
我假设Bill也是一个账户,但是当你只添加他的名字时,你与他的账户信息没有任何联系,也只能通过名字来识别他。为了进行某种验证,您需要 Bill 的唯一标识符。您可以添加 account_id
和 owner
.
而不是名称
所以如果有 3 个帐户:
- 克里斯
- 比尔
- 乔
您将添加 var obj = { account_id: 2, owner: 1 };
这样您就可以在添加新朋友之前使用 policies 检查 account_id 和所有者的朋友是否已经存在。如果您对如何使用政策有任何疑问,请直接提问。
无论如何,我认为更好的方法是只有一个模型,并且只与该模型建立 many to many 关系。帐户将通过 Sails 将创建的第三个 table(将是您的朋友 table)与自身建立多对多关系。这样,在新的 table 中,您将有两列包含帐户 ID。如果假设第一行的 ID 为 1 和 2,这意味着 Chris 和 Bill 都是朋友,您可以想出一些逻辑来确保行始终是唯一的,这样您就不会遇到垃圾邮件问题。郑重声明,我没有与一个模型建立多对多关系,因此您必须弄清楚它是如何完成的。
所以我对 Sails.js 很陌生,但它似乎给 table 带来了很多,比如这些蓝图,
现在我有 2 个模型,Accounts
/ Friends
它正在使用关联,因为 Accounts
有很多 Friends
在我的客户端,我有一种方法可以向用户发送通知,其中一种是好友请求,这样效果很好,它让用户可以选择接受或拒绝邀请
代码如下:
socket.on('accounts', function(data) {
if (data.verb === "addedTo" && data.attribute === "notifications") {
socket.get('/notifications/' + data.addedId, function(note) {
console.log(note);
if (!$.isEmptyObject(note)) {
$scope.notifications.push({
'text': note.from_name + ' sent you a friends request',
'id': note.id,
'type': note.type,
'from_id': note.from_id
})
$.notify('You have a new notification', 'info');
$scope.$digest();
}
})
}
})
$scope.accept = function(notificationId, fromId) {
}
当人们按下“接受”按钮时,我想为接受通知的人和发送通知的人添加好友,这样他们就可以相互成为好友。
我可以简单地通过创建一个数据对象并为他们两个的朋友做 socket.post
,然后做一个 socket.put
来更新正在读取的通知并处理它
唯一的问题是,我不希望人们进来并打开 JS 控制台和垃圾邮件 socket.post
向人们恶意发送百万朋友
var obj {
'friend_name': 'Bill',
'online': 1
}
socket.post('/accounts/1/friends', obj);
那么,我该如何保护它,以便访问 post
到 /accounts/1/friends
的人只是应该访问它的人?
如果我不明白就问吧。谢谢!
垃圾邮件示例:
有人打开 JS 控制台然后去
var obj = { friend_name: 'bill', owner: 1 }; io.socket.post('/friends', obj);
现在 500 次 id
1 的帐户有 500 个名为 bill
如果我误解了什么,请纠正我,但我认为你的逻辑是错误的。
我假设Bill也是一个账户,但是当你只添加他的名字时,你与他的账户信息没有任何联系,也只能通过名字来识别他。为了进行某种验证,您需要 Bill 的唯一标识符。您可以添加 account_id
和 owner
.
所以如果有 3 个帐户:
- 克里斯
- 比尔
- 乔
您将添加 var obj = { account_id: 2, owner: 1 };
这样您就可以在添加新朋友之前使用 policies 检查 account_id 和所有者的朋友是否已经存在。如果您对如何使用政策有任何疑问,请直接提问。
无论如何,我认为更好的方法是只有一个模型,并且只与该模型建立 many to many 关系。帐户将通过 Sails 将创建的第三个 table(将是您的朋友 table)与自身建立多对多关系。这样,在新的 table 中,您将有两列包含帐户 ID。如果假设第一行的 ID 为 1 和 2,这意味着 Chris 和 Bill 都是朋友,您可以想出一些逻辑来确保行始终是唯一的,这样您就不会遇到垃圾邮件问题。郑重声明,我没有与一个模型建立多对多关系,因此您必须弄清楚它是如何完成的。