【问题标题】:Bypassed authentication in route handling路由处理中绕过身份验证
【发布时间】:2017-11-27 14:41:34
【问题描述】:

我设置了一个应用程序,其中包含一个注册主页和一些需要登录的内部页面。 我使用 Node 和 Express.js 来设置服务器并控制路由和身份验证工作正常:如果我尝试访问 localhost:port/clientPage 如果我以前登录过,我会得到所需的页面,否则会出现错误消息。

问题是,如果我尝试访问 localhost:port/clientPage.html,即使我没有活动会话,我也会得到 clientPage。在这种情况下,我如何确保之前描述的相同 - 期望 - 行为?我将 GET 路由的代码附加到 clientPage:

router.get('/clientPage', function (req, res, next) {
  User.findById(req.session.userId)
    .exec(function (error, user) {
      if (error) {
        return next(error);
      } else {
        if (user === null) {
          var err = new Error('Not authorized! Go back!');
          err.status = 400;
          return next(err);
        } else {
          return res.sendFile(path.join(__dirname + '/../views/clientPage.html'));
        }
      }
    });
});

【问题讨论】:

  • 尝试 router.get('/clientPage*', 在第一行。希望这会有所帮助。
  • 您是否使用过任何一种express.static(path.join(__dirname, "public") 来为您的views 提供服务?
  • 哦。是的,我在这一点上同意 Zanko。
  • @Zanko 是的,在 app.js 中 {app.use(express.static(__dirname + '/views'));} 我现在明白这是问题所在 - 这似乎很愚蠢一,但如果你想提供一个答案,我会接受它 - 但为什么这会覆盖所有显示 html 文件的指定路由?
  • index.html 也可以进入 /views

标签: node.js express authentication


【解决方案1】:

由于问题是由将.html 添加到以某种方式绕过身份验证路由的路由的末尾引起的。我认为你很有可能拥有

express.static(path.join(__dirname, "views") 在您的应用程序开头公开为您的文件夹提供服务。

为什么它会覆盖您的路线?

Express 正在通过app.use(...) 顺序运行中间件。声明app.use(express.static...) 放在app.use(// your router) 之前,响应已提前解决给客户端。

利用这些知识,您可以通过在路由之前放置身份验证中间件来轻松限制其他路由,而不是将数据库调用嵌入到每个特定路由中。

app.use(require("./middleware/auth"));
app.use("/homepage", require("./routes/homepage"));
app.use("/clientPage", require("./routes/clientPage"));

【讨论】:

  • 这是一个非常好的主意,我应该尝试这种实现。但是,有些点我不清楚,为了清楚起见,我将发布一个单独的问题。如果您不介意,我很乐意在那里阅读您的回答。
  • @Alex 我很高兴澄清
猜你喜欢
  • 2019-07-09
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多