NodeJS + Express:如何保护URL

时间:2012-09-05 06:57:24

标签: node.js authentication login express middleware

我正在使用最新版本的NodeJS和ExpressJS(用于MVC)。

我通常像这样配置我的休息路径,例如:

app.get('/archive', routes.archive);  

现在我想要保护我的/admin/*个网址,我的意思是我只需要简单的身份验证,它只是一个草稿。

当用户尝试访问(例如/admin/posts时,在向他发送相应的视图和数据之前,我会检查req.session.authenticated。如果没有定义,我会重定向到登录页面。

登录页面有一个简单的验证表单和一个登录控制器方法:如果用户确实发送了“正确的用户”和“正确的密码”,我设置会话变量并对其进行身份验证。

我觉得很困难,或者我不明白,在每次/ admin / *路径调用之前,如何实际制作“过滤器”代码,我的意思是认证检查。

这是否与“中间件”快递功能有关?

谢谢

3 个答案:

答案 0 :(得分:66)

是的,中间件正是你想要的。中间件函数只是一个与任何其他Express路由处理程序一样工作的函数,它会在您的实际路由处理程序之前运行。例如,你可以这样做:

function requireLogin(req, res, next) {
  if (req.session.loggedIn) {
    next(); // allow the next route to run
  } else {
    // require the user to log in
    res.redirect("/login"); // or render a form, etc.
  }
}

// Automatically apply the `requireLogin` middleware to all
// routes starting with `/admin`
app.all("/admin/*", requireLogin, function(req, res, next) {
  next(); // if the middleware allowed us to get here,
          // just move on to the next route handler
});

app.get("/admin/posts", function(req, res) {
  // if we got here, the `app.all` call above has already
  // ensured that the user is logged in
});

您可以将requireLogin指定为每个您希望受到保护的路由的中间件,而不是使用app.all/admin/*调用,但按照我在此处显示的方式执行此操作可确保您不会意外忘记将其添加到以/admin开头的任何页面。

答案 1 :(得分:2)

更简单的方法是在App.js文件中添加以下代码。

var auth = function(req, res, next) {

    if(isAdmin) {

        return next();

    } else {

        return res.status(400)

    }
};

app.use('/admin', auth, apiDecrement);

正如您所看到的,中间件正在附加到路由中。在ExpressJS继续之前,它会执行您作为第二个参数传递的函数。

使用此解决方案,您可以在向最终用户显示站点之前进行不同的检查。

最佳。

答案 2 :(得分:1)

与brandon一样,但您也可以使用connect路线

app.use('/admin', requireLogin)
app.use(app.router)

app.get('/admin/posts', /* middleware */)