2017-08-04 32 views
0

我使用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); 
    }); 
+0

为什么不能你只需要在同一个块中的两个条件是什么? –

+0

我可以。但如果可能的话,想要处理与中间件的所有授权 – Scandinave

+0

根据我的理解,这是不可能的。 –

回答

1

内设置我不熟悉的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')如果私有访问被拒绝)。

+0

我已经编辑你的建议我的问题。 – Scandinave

+0

@Scandinave思考它,你可能不应该使用'onDenied'作为第二条路线,并让默认处理程序处理授权失败(重定向到“/ login”)。我会编辑我的答案,看看是否解决了你的404(尽管从我的理解你的问题,你正在设置全局'onDenied',你可能不应该这样做)。 – robertklep

+0

是的,工作。非常感谢 – Scandinave