NodeJS /将所有请求表达到特定路径

时间:2018-06-21 10:29:22

标签: node.js express authentication path

我不希望提供静态文件夹/文件。已经清除了,这是我的问题:

我有一个登录页面,并且在验证用户之后,我创建了一个会话。 基于此会话,我想让客户端访问/拒绝他们对URL路径 example.com/admin

的每个请求

为什么?我有对该URL的API调用,也有/public/admin/dashboard.html中的一个文件(是的,/ public文件夹用作静态文件夹)-所有这些传入请求都应该仅来自具有已验证会话的客户端

我尝试使用app.get("/admin/*",...,但这似乎也影响到所有其他具有get请求的域:

app.get("/admin/*", function(req, res) {
    if (req.session.email !== undefined) {
      console.log("User is verified to access");
      return res.redirect("/admin/dashboard.html");
    } else {
      console.log("Failed: User not verified, redirect to 404");
      return res.redirect("/404.html");
    }
  })

上面的代码在

之前被调用
app.use(express.static("./public"));

3 个答案:

答案 0 :(得分:1)

我不确定您是否在使用通配符URL匹配或加载静态文件时遇到问题。这是一个有关如何使用中间件来处理授权,然后从特定端点提供静态文件的示例。

这不是解决问题的复制粘贴,但是我希望这可以帮助您找到解决方案。

const authenticate = function(req, res, next) {
  if (req.sess.email === undefined) {
    return res.redirect('/404/.html');
  }
  next();
}

app.get('/admin/dashboard.html', auhenticate, function(req, res) {
    console.log('User is verified to access');
    return res.sendFile([File location for dashboard.html],
                        {headers: {'Content-Type': 'text/html'}});
});

答案 1 :(得分:1)

编写一个函数来验证用户以允许/admin/*路由,然后按以下方式使用它:

function validate(req, res, next){
  //logic to verify user, validate session
  if(user is allowed to access){
    next();//Proceed to handle the request
  }
  else{
    //end request with 401 as unauthorized
    res.status(401).send();
  }
}
app.get("/admin/*", validate, function(req, res) {
    //Actual response to send
  });

您可以对需要授权的任何请求使用验证功能。

更新:我不好。 /admin仅检查以/admin结尾的URL。因此,/admin/dashboard.html不起作用。如果要对其中所有带有/admin的URL进行授权检查,则可以像/admin/*一样使用正则表达式模式,并在验证后发送响应。希望这能解释您的查询。

答案 2 :(得分:0)

感谢@ lifetimeLearner007和@ R.Gulbrandsen将我引向正确的方向。 对于任何跟进的人,两者的结合解决了这个问题(但不知道为什么)

app.get("/admin/*", validateUser, function(req, res, next) {
    console.log("Validated");
    next();
  })

function validateUser(req, res, next) {
    console.log(req.session.email)
    if (req.session.email !== undefined) {
      console.log("User is verified to access");
      next();
    } else {
      console.log("Failed: User not verified, redirect to 404");
      return res.redirect("/404.html");
    }
  }