【问题标题】:ExpressJS Handle multiple get route with the same endpointExpressJS 处理具有相同端点的多个获取路由
【发布时间】:2017-08-04 17:12:23
【问题描述】:

我用 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')。

谢谢

编辑:

我已经像这样覆盖了 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);
    });

【问题讨论】:

  • 为什么你不能在同一个块中有两个条件?
  • 我可以。但如果可能的话,想用中间件处理所有授权
  • 据我了解这是不可能的。

标签: node.js rest express routes acl


【解决方案1】:

我对@9​​87654322@不熟悉,所以下面是从源头拼凑出来的,可能行不通。

首先,您需要更改处理身份验证不匹配的方式。默认是重定向到/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,但它基本上意味着不是将请求传递给当前链中的下一个处理程序,而是将其传递给下一个完整的路由链(在这种情况下是第二个@987654328 @ 如果私有访问被拒绝)。

【讨论】:

  • @Scandinave 考虑一下,您可能不应该将onDenied 用于第二条路由,而让默认处理程序处理授权失败(重定向到/login)。我将编辑我的答案,看看是否可以解决您的 404(尽管根据我对您问题的理解,您正在设置全局 onDenied,您可能不应该这样做)。
猜你喜欢
  • 2023-02-12
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多