我使用expressJS构建应用程序API。在这个应用程序中有一个公共部分和一个私人部分。ExpressJS使用相同的端点处理多个获取路由
两个部分需要显示的用户列表。但只有私人部分才能显示完整列表。
我用express-authorize middlewar处理autorization。所以我定义了两个授权:
'市民:用户:列表'
和
'私人:用户:列表'
在表达我有试着写的路线是这样的:
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);
});
为什么不能你只需要在同一个块中的两个条件是什么? –
我可以。但如果可能的话,想要处理与中间件的所有授权 – Scandinave
根据我的理解,这是不可能的。 –