2012-09-05 74 views
19

我正在使用最新版本的NodeJS和ExpressJS(用于MVC)。NodeJS + Express:如何保护URL

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

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

现在我想我的/admin/*组URL被固定,我的意思是我需要的只是简单的认证,它只是一个草案。

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

登录页面有一个简单的验证形式,以及登录在控制器的方法:如果用户不发送“正确的用户”和“正确的密码”我设置会话变量,将他的认证。

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

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

谢谢

回答

59

是的,中间件正是你想要的。中间件功能就像其他任何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

wow .... so StackOverflow有时候工作! :D ehehe谢谢,这正是我期望的答案。我会在下午尝试,如果一切正常,请接受你的出色答案。 THX再次 –

+0

很高兴帮助!如果您对此问题有任何疑问,请告诉我们!^_^ –

+0

使用令牌有什么区别? –

1

像布兰登,但你也可以去connect路线

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

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

你是什么意思? : - \ –

1

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

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

    if(isAdmin) { 

     return next(); 

    } else { 

     return res.status(400) 

    } 
}; 

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

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

有了这个解决方案,您可以显示该网站最终用户之前做不同的检查。

最好。