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

ExpressJS Handle multiple get route with the same endpoint

我用 expressJS 构建了一个应用程序 API。在这个应用程序中有一个 public 部分和一个私有部分。

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

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

'public:users:list'

'private:users:list'

在 express 中我试过这样写路由:

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').

感谢

编辑:

我已经像这样覆盖了 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。有什么建议吗?

编辑2:

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);
    });

我不熟悉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')