【问题标题】:How to handle authorization in a layered nodejs with passport app?如何在带有护照应用程序的分层nodejs中处理授权?
【发布时间】:2014-04-25 19:55:00
【问题描述】:

所以我正在尝试使用 nodejs 构建一个应用程序,使用 express 和 passport,但是当我尝试执行某种 TDD 时,我想将业务逻辑与控制器分离。

所以我有一个常见的场景是这样的:

  • 经过身份验证的用户想要删除一个项目,他向 api 发送请求:

    DELETE /api/item/1

  • 请求由控制器方法处理,它将发出请求的用户传递到下一层(这似乎不是一个好方法):

    exports.delete = function (req, res, next) { var itemId = req.params.id; var userId = req.user._id; itemService.delete(itemId, userId, function (err, item) { if (err) next(err); return res.json(item); }); };

  • 服务层(或任何您想调用的层,具有所有业务逻辑的层)然后检查项目是否由该用户拥有,然后将其删除或返回错误。

所以我想知道是否有任何方法可以在不从控制器传递的情况下从任何层获取当前用户。

【问题讨论】:

  • 你可以设置一个全局属性,但你真的不想这样做。

标签: node.js passport.js


【解决方案1】:

在路由配置中,您应该确保用户在将项目传递给控制器​​之前拥有该项目:

app.del('/api/item/1', ensureUserOwnsItem, itemController.delete);

这将导致函数ensureUserOwnsItem 在调用控制器之前被调用。 它应该是这样的:

function ensureUserOwnsItem(req, res, next) {
    if (/* user owns item */) {
        next();
    } else {
        res.send(401, 'You can\'t delete an item you don\'t own');
    }
}

您可以在POST 路由上重复使用它:

app.post('/api/item/1', ensureUserOwnsItem, itemController.post);

我建议你把这个函数放在AuthController 或类似的地方。

【讨论】:

  • 谢谢!这看起来不错。我也会利用这个中间件来验证 ids(valid ObjectId)等
猜你喜欢
  • 1970-01-01
  • 2018-04-29
  • 2011-06-24
  • 2019-10-31
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
相关资源
最近更新 更多