验证 Passport.js 中的访问权限/组

Posted

技术标签:

【中文标题】验证 Passport.js 中的访问权限/组【英文标题】:Verify access/group in Passport.js 【发布时间】:2013-03-21 02:11:39 【问题描述】:

我想使用 passport.js 来验证当用户点击某些端点时,他们不仅拥有正确的密码,而且是特定组的成员或具有特定的访问权限。

为了简单起见,如果我有 USER 和 ADMIN 的访问级别。

我可以使用护照来验证密码:

passport.use(new LocalStrategy(
  function(username, password, done) 
    User.findOne( username: username , function(err, user) 
      if (err)  return done(err); 
      if (!user) 
        return done(null, false,  message: 'Incorrect username.' );
      
      if (!user.validPassword(password)) 
        return done(null, false,  message: 'Incorrect password.' );
      
      return done(null, user);
    );
  
));

然后通过路由我可以确保用户通过身份验证:

app.get('/api/users',
  passport.authenticate('local'),
  function(req, res) 
    res.json( ... );
  );

但是假设您需要拥有管理员权限才能访问 /api/users'。我需要编写自己的策略吗? IE 我是否需要有本地用户和本地管理员策略,并在每个策略中验证正确的访问级别?

我认为我可以很容易地做到这一点,但是当我需要我的网站具有不同的身份验证方法(有时可能使用 oauth)时,问题就出现了,我需要为每个方法编写自定义的 *-user、*-admin 策略。看起来有点矫枉过正。

其他选项是在用户通过身份验证后仅验证每个路由中的访问/组。但如果可能,我更愿意在中间件中执行此操作。

谢谢

【问题讨论】:

【参考方案1】:

您可以创建一个简单的中间件来检查组:

var needsGroup = function(group) 
  return function(req, res, next) 
    if (req.user && req.user.group === group)
      next();
    else
      res.send(401, 'Unauthorized');
  ;
;

app.get('/api/users', 
  passport.authenticate('local'),
  needsGroup('admin'), 
  function(req, res) 
    ...
  );

这假定存储在req.user 中的对象具有属性group。这个对象是从策略实现和deserializeUser传递过来的。

替代方案可能是connect-roles,但我不知道它与 Passport 的集成情况如何。

编辑:您还可以结合 Passport 和组检查中间件:

var needsGroup = function(group) 
  return [
    passport.authenticate('local'),
    function(req, res, next) 
      if (req.user && req.user.group === group)
        next();
      else
        res.send(401, 'Unauthorized');
    
  ];
;

app.get('/api/users', needsGroup('admin'), function(req, res) 
);

【讨论】:

哦,我明白了。看起来您可以使用按顺序调用 express 的“中间件”函数数组。连这一点都没有意识到,一定是错过了。是时候再次阅读手册了;)谢谢,这太完美了! 是的,它是:'app.VERB(path, [callback...], callback)'。对不起,我错过了,感谢您的回答如此友好! 我正在寻找的是可选身份验证:***.com/questions/25806339/… 我知道这很挑剔,但我认为 403 可能更适合这种情况下的响应。那时身份验证已通过护照通过,因此确实是未经授权的请求。 我的问题是我的角色是动态的后端 api 如何在这种情况下处理任何建议??

以上是关于验证 Passport.js 中的访问权限/组的主要内容,如果未能解决你的问题,请参考以下文章

Passport.js:LocalStrategy 如何访问用户信息?

如何正确使用 Passport.js?

如何使用 Passport.js 访问 Cookie 集

在不同情况下使用 Passport.js 更改和保存重定向

配置文档的访问权限

使用 Passport.js 的 Vue.js 客户端和 Express.js 服务器的完整 Oauth2 身份验证流程