【问题标题】:NodeJS / Express all requests to specific pathNodeJS / 将所有请求表达到特定路径
【发布时间】:2018-11-30 15:40:26
【问题描述】:

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

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

的每个请求

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

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

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"));

【问题讨论】:

    标签: node.js express authentication path


    【解决方案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/* 一样使用正则表达式模式,然后在验证后发送响应。希望这能解释您的问题。

    【讨论】:

    • 这似乎可行,但是,使用 app.get 验证(就像我做的那样)和使用函数(你的方式)有什么区别。
    • 对于其他需要保护的路由,无需重复授权码。您可以简单地为所有其他路由重复使用此验证功能(有点像中间件),并保持实际路由处理干净和简单。
    • 我知道,但我的问题是这两个功能有什么不同,一个有效,另一个无效
    • 尝试在您的代码中不使用 /*,例如 app.get('/admin', function(){})... 它也应该可以工作
    • 刚刚意识到,您的答案也适用于/admin 请求,但不适用于/admin/dahsboard.html
    【解决方案2】:

    我不确定您是否在通配符 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'}});
    });
    

    【讨论】:

    • 嗯.. 不确定,但此解决方案不会阻止访问例如/index.html 哪个应该是公开的?
    • 不过,这也是解决方案,其他的似乎更完整
    • 好。如果您在 url 中输入 /admin/dashboard.html,我不明白为什么您会重定向到 /admin/dashboard.html。这将是我脑海中的一个循环。提供的解决方案通过在您输入 /admin 时重定向到新位置来消除此问题,但您应该使用 /admin/dashboard.html 进行测试以查看您无法访问它..
    【解决方案3】:

    感谢@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");
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 2013-01-15
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2010-09-06
      相关资源
      最近更新 更多