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



我不想提供静态文件夹/文件。清除后,这是我的问题:

我有一个登录页面,在用户通过验证后,我创建了一个会话。 基于此会话,我想让客户端访问/拒绝他们对 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"));

编写一个函数来验证用户是否允许/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/*一样使用正则表达式模式,然后在验证后发送响应。 希望这可以解释您的查询。

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

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

最新更新