如何在快递中输入每条路线之前使用中间件检查授权?

时间:2013-09-09 14:35:52

标签: node.js express middleware

我想在输入网址时检查我的网络应用用户的授权。但是,当我使用单独的中间件来检查授权时,它对已有的路由没用,例如:

function authChecker(req, res, next) {
    if (req.session.auth) {
        next();
    } else {
       res.redirect("/auth");
    }
}

app.use(authChecker);
app.get("/", routes.index);
app.get("/foo/bar", routes.foobar);

authChecker 无法检查输入两个网址的用户的权限。 它仅适用于未指定的URL。

我看到了一种方法,我可以将 authChecker 放在路由和路由处理程序之间, 如:

app.get("/", authChecker, routes.index);

但是,如何以简单的方式实现它,而不是将authChecker放在每条路线中?

3 个答案:

答案 0 :(得分:28)

只要

app.use(authChecker);

之前

app.use(app.router);

每个请求都会调用它。但是,您将获得“太多重定向”,因为它被称为所有路径,包括 / auth 。所以为了解决这个问题,我建议将函数修改为:

function authChecker(req, res, next) {
    if (req.session.auth || req.path==='/auth') {
        next();
    } else {
       res.redirect("/auth");
    }
}

这样您也不会重定向到auth网址。

答案 1 :(得分:23)

有很多方法可以解决这个问题,但这对我有用。

我喜欢为受保护和不受保护的路由创建一组中间件,然后在必要时使用。

var protected   = [authChecker, fetchUserObject, ...]
var unprotected = [...]

app.get("/", unprotected, function(req, res){
  // display landing page
})

app.get("/dashboard", protected, function(req, res){
  // display private page (if they get this far)
})

app.get("/auth", unprotected, function(req, res){
  // display login form
})

app.put("/auth", unprotected, function(req, res){
  // if authentication successful redirect to dashboard
  // otherwise display login form again with validation errors
})

通过编辑每种类型路由的数组,可以轻松扩展每个中间件范围的功能。它还使每条路线的功能更加清晰,因为它告诉我们路线的类型。

希望这有帮助。

答案 2 :(得分:1)

  

但是当我使用单独的中间件来检查授权时,它对已有的路由没用了

Express将按添加到堆栈的顺序运行中间件。路由器是这些中间件功能之一。只要你在路由器之前将authChecker放入堆栈,它就会被所有路由使用,并且事情会起作用。

很可能在authChecker之前有路由器,因为在将authChecker放入堆栈之前已经定义了路由。确保在调用app.useapp.get等之前放置所有app.post来电,以避免表达令人愤怒的隐含注入路由器到中间件堆栈。