繁体   English   中英

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

[英]Express resources with authentication 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'));

不起作用。

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

只需确保从护照中调用ensureAuthenticated即可。

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

它在这里找到: https//gist.github.com/1941301

解决方法。 确保对所有请求进行身份验证,并忽略进入/ 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));
  }
});

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

https://gist.github.com/3610934

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

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

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

希望这有助于某人!

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

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

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

这有效:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM