29

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

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

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

现在我希望我/admin/*的一组 URL 得到保护,我的意思是我只需要简单的身份验证,这只是一个草稿。

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

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

我发现困难或不明白的是如何在每个 /admin/* 路径调用之前实际制作“过滤器”代码,我的意思是,身份验证检查。

这与“中间件”表达功能有关吗?

谢谢

4

3 回答 3

78

是的,中间件正是你想要的。中间件函数只是一个与任何其他 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为中间件,而不是使用调用 with ,但按照我在此处显示的方式进行操作可确保您不会意外忘记将其添加到以 开头的任何页面。app.all/admin/*/admin

于 2012-09-05T07:05:05.963 回答
5

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

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

    if(isAdmin) {

        return next();

    } else {

        return res.status(400)

    }
};

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

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

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

最好的。

于 2015-09-08T10:14:52.047 回答
1

喜欢布兰登,但你也可以走这connect条路

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

app.get('/admin/posts', /* middleware */)
于 2012-09-05T08:58:09.557 回答