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

时间:2018-06-22 09:11:51

标签: express authentication

我该如何编写中间件以仅批准条目所有者进行编辑/删除/?

我尝试搜索每个条目(在每个条目中都有userId),然后将当前用户的UserId与条目中的userId进行比较。 但这不是好方法

1 个答案:

答案 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。