ExpressJS处理具有相同端点的多个get路由

时间:2017-08-04 17:12:24

标签: node.js rest express routes acl

我使用expressJS构建应用程序API。在这个应用程序中,有一个公共部分和一个私有部分。

这两个部分都需要显示用户列表。但只有私有部分才能显示完整列表。

我使用express-authorize middlewar来处理自动化。所以我已经定义了两个授权:

  

'公共:用户:列表'

  

'私人:用户:列表'

在快递中我试图写这样的路线:

router.route('/users')
    .get([passport.authenticate('jwt', { session: false }), authorization.authorizer.isPermitted('private:users:list')], (req, res) => {
        getUserList(req, res);
    })
    .get([passport.authenticate('jwt', { session: false }), authorization.authorizer.isPermitted('public:users:list')], (req, res) => {
        req.query.filter.roles.name = 'user'
        getUserList(req, res);
    });

但这不起作用。请求在第一次获取时未通过授权而从未进入第二次。这有什么意义吗?或任何其他技术。如果可能,请避免创建另一个端点,例如(router.route(' usersPublic')。

THX

修改

我已经覆盖了这样的onDenied函数并在路径中进行了更改。

var authorizer = new authorizer.Authorizer(authorizer.options);
authorizer.options.onDenied = function (req, res, next) { next('route') };


authorizer.options.withSubject = function (req, res, done) {}

这似乎有效。但如果没有路线有效。我得到404错误而不是403.有任何建议吗?

EDIT2:

onDenied不应该设置为全局,而应该像路径一样设置在路径内

   router.route('/users')..get([passport.authenticate('jwt', { session: false }), authorization.authorizer.onDenied((req, res, next) => next('route')).isPermitted('private:users:list')], (req, res) => {
            getUserList(req, res);
        });

   router.route('/users')..get([passport.authenticate('jwt', { session: false }), authorization.authorizer.isPermitted('public:users:list')], (req, res) => {
        req.query.filter.roles.name = 'user'
        getUserList(req, res);
    });

1 个答案:

答案 0 :(得分:1)

我不熟悉express-authorize,因此以下内容从源代码拼凑而成,可能无效。

首先,您需要更改处理身份验证不匹配的方式。默认设置是重定向到/login,但您需要更改它以便将请求传递到下一个路径链:

let myAuthorizer = authorization.authorizer.onDenied((req, res, next) => next('route'));

然后,您需要为/users

设置两个单独的路线
router.route('/users').get([passport.authenticate('jwt', { session: false }), myAuthorizer.isPermitted('private:users:list') ], (req, res) => {
  getUserList(req, res);
})

router.route('/users').get([passport.authenticate('jwt', { session: false }), authorization.authorizer.isPermitted('public:users:list')], (req, res) => {
  req.query.filter.roles.name = 'user'
  getUserList(req, res);
});

next('route')被解释为here,但它基本上意味着它不是将请求传递给当前链中的下一个处理程序,而是传递给下一个完整的路径链(在这种情况下是如果私人访问被拒绝,则为第二个router.route('/users')