首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将jwt身份验证与ACL混合使用

如何将jwt身份验证与ACL混合使用
EN

Stack Overflow用户
提问于 2016-03-05 19:50:17
回答 1查看 4K关注 0票数 5

我已经能够使用JWT策略实现护照,而且效果很好。我的护航路线是这样的.

代码语言:javascript
复制
app.get('/thingThatRequiresLogin/:id', passport.authenticate('jwt', { session: false }), thingThatRequiresLogin.findById);

现在,我需要将某些事情的访问限制为只属于某个角色的登录用户。我真希望我能这样说:

代码语言:javascript
复制
app.get('/thingThatRequiresLogin/:id', MAGIC, thingThatRequiresLogin.findById);

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

acl似乎是一个很好的解决方案,我在某种程度上理解它,但我在文档中发现了这一点.

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

代码语言:javascript
复制
app.put('/blogs/:id', acl.middleware(), function(req, res, next){…}

中间件将保护req.url命名的资源,从req.session.userId中选择用户并检查req.method的权限,因此上面的内容相当于如下所示:

如何将此与我的jwt策略结合起来?我唯一的想法是放弃node_acl middleware,而将acl检查代码添加到我的jwt策略中。但那就是我遇到麻烦的地方。我的jwt函数如下所示:

代码语言:javascript
复制
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说,我可以问这样的问题.

代码语言:javascript
复制
acl.isAllowed('jsmith', 'blogs', ['edit','view','delete'])

所以我可以(应该吗?)改变我的JwtStrategy说.

代码语言:javascript
复制
    if (user && acl.isAllowed(user.username, 'blogs', ['edit','view','delete']) {
        // ...

如果是的话,这个函数如何知道资源名称'blogs'和权限['edit' etc]?这些都是已知的点,路线是定义的,但我想我需要他们的战略功能。我是不是搞错了?谁能给我指明正确的路吗?

EN

回答 1

Stack Overflow用户

发布于 2016-08-28 00:36:09

代码语言:javascript
复制
app.get('/thingThatRequiresLogin/:id', 
  [
     passport.authenticate('jwt', { session: false }), 
     acl.middleware( 1, getUserId )
  ], 
  thingThatRequiresLogin.findById);

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

numPathComponents: 1//选择thingThatRequiresLogin路径

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

我希望这能帮到你

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35819042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档