如何将jwtauthentication与ACL混合

我已经能够使用JWT策略实施护照,并且运作良好。 我的jwt保护路线看起来像这样…

app.get('/thingThatRequiresLogin/:id', passport.authenticate('jwt', { session: false }), thingThatRequiresLogin.findById); 

现在我需要限制某些东西的访问权限,只有属于某个angular色的login用户。 我希望我可以这样expression:

 app.get('/thingThatRequiresLogin/:id', MAGIC, thingThatRequiresLogin.findById); 

其中MAGIC = require logged-in users, but only those with role x or y

node_acl似乎是一个很好的解决scheme,我理解了一点,但是我发现这在文档中…

我们可以保护这样的资源:

 app.put('/blogs/:id', acl.middleware(), function(req, res, next){…} 

中间件将保护由req.url命名的资源,从req.session.userId中select用户,并检查req.method的权限,所以上面的代码就是这样的:

我如何将这与我的jwt策略混合? 我唯一的想法是放弃node_acl middleware ,而是添加acl检查代码到我的jwt策略。 但那是我遇到麻烦的地方。 我的jwtfunction如下所示:

 passport.use(new JwtStrategy(jwtOptions, function(jwt_payload, done) { User.findOne({id: jwt_payload.sub}, function(err, user) { if (err) { return done(err, false); } if (user) { done(null, user); } else { done(null, false); // or you could create a new account } }); })); 

根据node_acl,我可以问这样的事情…

 acl.isAllowed('jsmith', 'blogs', ['edit','view','delete']) 

那么我可以(我应该吗?)改变我的JwtStrategy说像…

  if (user && acl.isAllowed(user.username, 'blogs', ['edit','view','delete']) { // ... 

如果是的话,这个函数将如何知道资源名称'blogs'和权限['edit' etc] ? 这些在路线被定义的点上是已知的,但我认为我需要他们在战略function。 我是否全部错了? 有人能告诉我正确的方法吗?

       

网上收集的解决方案 "如何将jwtauthentication与ACL混合"

 app.get('/thingThatRequiresLogin/:id', [ passport.authenticate('jwt', { session: false }), acl.middleware( 1, getUserId ) ], thingThatRequiresLogin.findById); 

从这个要点: https ://gist.github.com/danwit/e0a7c5ad57c9ce5659d2和npm: https: //www.npmjs.com/package/acl#middleware上的node_acl文档acl.middleware需要三个可选的参数: acl.middleware(numPathComponents,userId,权限)

numPathComponents:1 //selectthingThatRequiresLoginpath

userId:getUserId // getUserId是一个返回userId的函数

我希望这有帮助