ExpressJS授权用户使用中间件?

时间:2016-02-15 06:16:39

标签: node.js express

假设我想限制资源对符合某些条件的某些人的访问权限。我现在正在做的是定义一个授权中间件,检查req.user是否满足这些条件。

module.exports.requiresCondition = function(req, res, next){
    Model.findOne({condition: condition}, function(err, model){
        //check if various conditions are met. If not, return 401
        res.locals.model = model;
        return next();
    }
}

我遇到的问题是我无法选择要投影的数据,因为之后的路线可能会使用模型的不同部分。这意味着我必须每次都获得整个模型,随着文档变得越来越大,这变得效率低下。当然,我只需要在中间件中查询一次我需要在实际控制器中再次授权和查询的密钥,但这似乎也不是特别有效。是否有更好的方法来授权用户?

1 个答案:

答案 0 :(得分:0)

如果不同的路由需要不同的数据,您可以模块化中间件层。 composable-middelware https://www.npmjs.com/package/composable-middleware非常适合。

所以,假设您有几条路线:

import compose from 'composable-middleware';

router.get('/type1/:id', compose().use(Auth.hasAppAccess()).use(TypeMiddleware.getType1()), ctrl.doType1);
router.get('/type2/:id', compose().use(Auth.hasAppAccess()).use(TypeMiddleware.getType2()).use(TypeMiddleware.evenMoreOperations()), ctrl.doType2);

然后你的中间件本身

import compose from 'composable-middleware';

export function isAuthenticated() {
    return compose()
        .use(function(req, res, next) {
            //do your stuff here
        })
}

//similarly for other middelware functions