首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何结合passport-jwt和ACL(访问控制列表)模式

如何结合passport-jwt和ACL(访问控制列表)模式
EN

Stack Overflow用户
提问于 2018-03-27 09:38:47
回答 1查看 813关注 0票数 2

我正在使用passport-jwt。我正在尝试在我的系统中实现acl模式。在我的系统中有一些不同的角色。我想控制他们对某些资源的访问权限。

我认为在基于令牌的身份验证中,最常见的方法是为express.js编写一个中间件,它将验证令牌并在“req.user”中添加一个“角色”字段。然后将另一个中间件挂载到每个路由,该中间件将指定哪些角色可以访问它们。所以我的问题是,如何将这种方法与passport-jwt结合起来。

另外:使用passport-jwt策略的常用方法:

代码语言:javascript
复制
  app.get('/myapi', passport.authenticate('jwt', {session: false}),
    function(req, res, next){ ...})

我认为基于令牌的身份验证的常见方式是:

代码语言:javascript
复制
app.use(function(req, res, next){
  token = extractToken(req)
  jwt.verify(token, key, function(err, decoded) {
    if (err) {
      return res.send(err);
    } else {
      users.findOne({userId: decoded.userId}, function(err, user){
        if(!user) res.send('unknown')
        else{
          req.user = user //in which include a role field.
                      // for example: user.role = 'user' | 'manager'
        }
      })
    }
  });
})

and at every route:

function checkRole(roles){
  return function (req, res, next) {
    if (req.session.user && roles.includes(req.user.role)) {
        next();
    } else {
        res.send(403);
    }
  }
}

app.get('/myapi', checkRole(['user']), function(req, res){
  ....
})
EN

回答 1

Stack Overflow用户

发布于 2018-03-27 10:49:15

我自己弄明白了。我写了一个中间件来一起做这些事情:

代码语言:javascript
复制
/*middleware/acl.js */

export function checkRoleWithPassport(roles, passport, strategy, opts){
  return function(req, res, next){
    passport.authenticate(strategy, opts, function(err, user, info){                        
      if(err) res.status(403).send('forbidden')                                             
      else if(!user) res.status(403).send('forbidden')                                      
      else{                                                                                 
        if(roles.length == 0)                                                               
          next()                                                                            
        else if(roles.includes(user.role))                                                  
          next()                                                                            
        else                                                                                
          res.status(403).send('forbidden')                                                 
      }                                                                                     
    })(req, res, next)                                                                                    
  }                                                                                         
}     

/* route/index.js */
app.get('/myapi', checkRoleWithPassport(['manager'], passport, 
  'jwt', {session, false}), function(req, res){
   ...
})   // this should only allow the 'manager' to access /myapi
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49503124

复制
相关文章

相似问题

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