Nodejs Express 4 Multer |如果用户未经授权,请停止上传文件

时间:2014-08-23 10:04:19

标签: node.js express multer

我使用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());   

3 个答案:

答案 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。文件将不会被处理或到达文件系统。”