我不希望提供静态文件夹/文件。已经清除了,这是我的问题:
我有一个登录页面,并且在验证用户之后,我创建了一个会话。 基于此会话,我想让客户端访问/拒绝他们对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"));
答案 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");
}
}