【发布时间】: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