Express 中间件授权
我有一个应用程序需要根据请求用户和请求资源之间的关系进行授权。访问详细信息封装在要请求的资源中 让我们采取路径Express 中间件授权,express,authorization,middleware,koa,Express,Authorization,Middleware,Koa,我有一个应用程序需要根据请求用户和请求资源之间的关系进行授权。访问详细信息封装在要请求的资源中 让我们采取路径补丁/articles/1:这篇文章有一位作者/所有者和一组编辑,他们都有权更新这篇文章。请求用户经过身份验证,可以是作者或其中一个编辑器。否则,应拒绝访问 -- 我有两个想法: 中间件中的授权: 这意味着,在控制器能够聚合资源之前,中间件就已经需要资源了。但是,有时(例如,在使用MongoDB聚合框架时),控制器将无法重用资源,并且需要另一次到数据库的往返 控制器中的授权: 一旦资源可
补丁/articles/1
:这篇文章有一位作者/所有者和一组编辑,他们都有权更新这篇文章。请求用户经过身份验证,可以是作者或其中一个编辑器。否则,应拒绝访问
--
我有两个想法:
这意味着,在控制器能够聚合资源之前,中间件就已经需要资源了。但是,有时(例如,在使用MongoDB聚合框架时),控制器将无法重用资源,并且需要另一次到数据库的往返
一旦资源可用/聚合,就可以在控制器中执行授权。但这将把这部分授权与身份验证和基于角色的访问控制分开,我已经将其作为中间件准备好了
请注意,我不是在询问身份验证或经典的基于角色的访问,例如。我的正常模式是使用路由参数从数据库获取资源,例如:
app.param("articleId", function (req, res, next, paramValue) {
var _id;
try {
_id = new ObjectID(paramValue);
} catch (error) {
res.status(400).send('Invalid ID');
return;
}
Article.findById(_id, function(error, doc){
if (error) {
next(error);
return;
}
if (doc) {
req.article = doc;
next();
return;
}
res.send(404);
});
});
然后我使用一个中间件进行授权,但它可以假设req.article
已经从数据库中加载
这是一个很好的默认模式,我认为您应该使用它一段时间,并在进行任何性能优化之前习惯它,但是当您确实有足够的流量来选择一个不太通用的模式时,就尝试一下。请记住,这通常在创业/项目的第二年或第三年是合理的,而不是在启动日。谢谢,听到这个消息很高兴:)这也是正确的。但有一件事:如果我的路线在相关资源(例如评论
)上工作,但访问详细信息在故事
中,该怎么办?我需要预先获取注释,然后(MongoDB)将它们附加到请求对象。在这种情况下,您是否也有多种不同的方法(attach
,attachThroughComments
,…)?