我该如何编写中间件以仅批准条目所有者进行编辑/删除/?
我尝试搜索每个条目(在每个条目中都有userId),然后将当前用户的UserId与条目中的userId进行比较。 但这不是好方法
答案 0 :(得分:0)
要验证这一点,您需要知道以下两个方面:
根据我可以推断出的问题,您有了userId,并且我假设它是在请求中。
现在,该条目呢。您希望删除的条目最有可能在数据库中,因此您必须查询数据库以查找元素,并查看所有者是否为当前用户。切记永远不要信任来自REST客户端的任何东西
以下是可以为您完成此操作的中间件的概述:
const validateOwner = (req, res, next) => {
const entryId = req.params.entryId || req.body.entryId;
if (entryId === undefined) {
return res.status(400).send('missing entryid);
}
const userId = req.user.userId;
Database.findEntryWithId(entryId).then(entry => {
if (entry.ownerId === userId) {
next();
} else {
return res.status(403).send('Forbidden Action');
}
}).catch(() => {
return res.status(500).send('Internal Server Error');
};
};
使用中间件删除
app.delete('/api/entries/:entryId', validateOwner, (req, res) => {
//Delete logic
res.send('Element was deleted');
});
使用中间件进行更新
app.put('/api/entries/', validateOwner, (req, res) => {
//Delete logic
res.send('Element was deleted');
});
由于用户可以更改客户端中的entryId并将其发送回服务器,因此我们必须从数据库中验证entryId,而不信任主体中的ID。