只有所有者(创建者)可以编辑/删除条目expressJS
如何编写一个中间件来只批准要编辑/删除的条目的所有者 我尝试搜索每个条目(每个条目中都有userId),然后将当前用户的userId与条目中的userId进行比较。只有所有者(创建者)可以编辑/删除条目expressJS,express,authentication,Express,Authentication,如何编写一个中间件来只批准要编辑/删除的条目的所有者 我尝试搜索每个条目(每个条目中都有userId),然后将当前用户的userId与条目中的userId进行比较。 但这不是验证这一点的好方法,您需要了解两个方面: 当前用户是谁 元素的所有者是谁 根据我对你的问题的推断,你有用户ID,我假设它是在请求中 那么,条目呢。您希望删除的条目很可能在数据库中,因此您必须查询数据库以查找元素,并查看所有者是否是当前用户。记住永远不要相信来自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');
});
使用中间件进行更新
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