只有所有者(创建者)可以编辑/删除条目expressJS

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

如何编写一个中间件来只批准要编辑/删除的条目的所有者

我尝试搜索每个条目(每个条目中都有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