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