Passport.js:如何保护所有路线?

时间:2019-02-10 06:02:31

标签: node.js passport.js passport-local

我遵循了当地护照http://www.passportjs.org/docs/authorize/

的passport.js文档

当我将用户发送到/login时,他们已经通过了身份验证,但是我在该文档的任何地方都找不到如何授权我的用户。

我已经尝试过了,但这给了我一个bad request

router.get('/somepage', passport.authenticate('local'), function(req, res, next) {

});

我正在寻找一种方法来一次保护我的所有页面。我正在使用Express 4.16,并使用不同的路由文件来分割我的路由。

山姆

4 个答案:

答案 0 :(得分:1)

您可以像下面那样添加中间件代码

router.get('/', isAuthenticated, function(req, res) {
   //your next function 
});
function isAuthenticated(req, res, next) {
  // do any checks you want to in here

  // CHECK THE USER STORED IN SESSION FOR A CUSTOM VARIABLE
  // you can do this however you want with whatever variables you set up
  if (req.user.authenticated)
      return next();

  // IF A USER ISN'T LOGGED IN, THEN REDIRECT THEM SOMEWHERE
  res.redirect('/');
}

答案 1 :(得分:1)

您可以使用middleware和一个小技巧在策略之间进行切换

示例:

const allowUrl = ['public', 'nonprivate','home'];


const authenticationMiddleware = (whiteList =[]) => (req, res, next) => {
    if(whiteList.find(req.baseUrl)) {
      next();
    }

    if (req.isAuthenticated()) {
      return next()
    }
    res.redirect('/');
}


app = express();
app.use(passort.initialize());
app.use(authenticationMiddleware(allowUrl));
app.use(apiRouter);


app.listen(3000, ()=> console.log('hello internet');

答案 2 :(得分:0)

我不确定您的意思是“但是在该文档中找不到我可以授权用户的方式”。 Passportjs不会授权任何用户。它是身份验证中间件。授权与身份验证不同。

我认为您正在寻找应用程序级中间件。您必须使用app.use才能使对服务器的每个请求的身份验证工作。 你可以在这里读更多关于它的内容。 https://expressjs.com/en/guide/using-middleware.html#middleware.application

答案 3 :(得分:0)

由于我希望所有路由(当然,登录路由除外)都可以通过授权,因此我按以下方式解决了此问题:

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

// usersRouter contains all open routes like '/login':
app.use('/', usersRouter);

// From here on, all routes need authorization:
app.use(ensureAuthenticated);

app.use('/', indexRouter);
app.use('/api/foo', fooRouter);
app.use('/api/bar', barRouter);