我使用multer
作为express4的多部分middelware。
Express配置为使用passport作为auth middelware,但如果用户未经过身份验证,我找不到阻止文件上载的方法。
我想使用onFileUploadStart拒绝该文件,但我找不到" request"的链接。对象,可以与用户匹配。
以下代码用于配置express vs multer:
...
// Multipart file upload
app.use(multer(
{
dest: wwwroot + path.sep + 'uploaded' + path.sep,
onFileUploadStart: function (file) {
//TODO : apply security check : user auth, file size, number...
console.log(file.fieldname + ' is starting ...')
},
onFileUploadComplete: function (file) {
console.log(file.fieldname + ' uploaded to ' + file.path)
}
}));
...
app.use(passport.auth.initialize());
app.use(passport.auth.session());
答案 0 :(得分:7)
修改强>
如果有帮助,我会留下以下答案,但答案实际上非常简单:您需要将两个电话移至app.use(passport)
以上来调用{ {1}}。快速链中的每个步骤都按顺序处理,因此如果您希望拒绝执行错误的auth尝试,请在处理传入的文件上载之前执行。
可能有更好的方法可以做到这一点,但这应该让你开始。更改您的快速配置以使用关闭,您就可以完全访问app.use(multer)
变量。
req
答案 1 :(得分:3)
好的,我想我找到了一个解决方案。它不是我自己的问题的完整解决方案,但它适用于您的特定情况,即在下载文件之前检查用户是否通过Passport授权。
诀窍是在后期处理程序中使用中间件一次做一件事。将调用第一个护照将用户对象放入req对象中。然后,检查用户是否已通过身份验证。如果是这种情况,请下载该文件,然后使用它。这是一个示例:
//don't add multer as a middleware to all requests.
//If you do this, people will be able to upload files
//in ALL YOUR 'post' handlers!!!
var Multer = require('multer');
//this is a middleware to check if user is authenticated
function check(req, res, next){
if(req.isAuthenticated()){
console.log(req.user);
next();
}
else{
res.send(401);
}
}
//this is a middleware to be called after file is downloaded
function finish(req, res, next){
var filePath = req.files.file.path;
res.send("Hello " + req.user.name + "! Your file was uploaded to " + filePath);
}
//this is the route handler. First check auth. If so,
//proceed to multer middleware to download file
//lastly, use the file as you need
app.post('/test', [check, Multer(), finish]);
这只能起作用,因为Passport不使用正文数据来验证用户:它使用不在正文中的会话。因此,您可以使用Passport并获取用户数据,但是您不能确保在开始下载文件之前解析所有非文件字段(因为它们以明确的req流汇总在一起)
答案 2 :(得分:0)
从multer api doc“你甚至可以阻止文件被上传 - 只需从事件处理程序返回false。文件将不会被处理或到达文件系统。”