用身份验证中间件来表达资源?

时间:2012-02-09 15:28:51

标签: javascript node.js express connect middleware

Passport.js为node.js和Express提供了很好的身份验证,包括中间件解决方案:

ensureAuthenticated = function(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
  }
  return res.redirect("/login");
};

如何在快速资源模块中使用此中间件?不幸的是,

app.resource('users', ensureAuthenticated, require('./resources/users'));

不起作用。

6 个答案:

答案 0 :(得分:13)

我知道这有点太晚了,原来的帖子得到了解答,但是,我正在寻找相同的答案并找到了我认为其他人可能想知道的解决方案。

确保从护照中调用ensureAuthenticated。

    app.resource('users', passport.ensureAuthenticated, require('./resources/users'));

可在此处找到:https://gist.github.com/1941301

答案 1 :(得分:5)

解决方法。确保对所有请求进行身份验证,并忽略进入/ auth和/ auth / callback的请求。

app.all('*', function(req, res, next) {
  if (/^\/auth/g.test(req.url)) {
    return next();
  } else if (req.isAuthenticated()) {
    return next();
  } else {
    return next(new Error(401));
  }
});

答案 2 :(得分:2)

为了让每个资源都使用身份验证中间件,您需要做一些魔术。以下要点解释了如何通过使用菜单结构来实现这一目标。

https://gist.github.com/3610934

基本上,您需要以下逻辑:

app.all('/' + item.name + '*', ensureAuthenticated, function (req, res, next) {
  next();
});

然后,您可以在菜单结构中指定受保护的资源,以及它们是否需要任何类型的特定权限,甚至可以指定HTTP方法级别。

希望这有助于某人!

答案 3 :(得分:0)

我不确定express-resource是否可以选择将中间件插入特定资源,但是如果你在中间件内的资源中,你可以随时插入检查。

ensureAuthenticated = function(req, res, next) {
  if (!/^users/.test(req.url) || req.isAuthenticated()) {
    return next();
  }
  return res.redirect("/login");
};

答案 4 :(得分:0)

这有效:

app.get('/',ensureAuthenticated,admin.index);

只要您的策略设置正确。我正在使用本地策略。查看指南:

http://passportjs.org/guide/username-password.html

答案 5 :(得分:0)

我也在查找这个主题,并找到https://npmjs.org/package/express-resource-middleware。但是没有测试过它。