【问题标题】:Nodejs Express 4 Multer | Stop file upload if user not authorizedNodejs Express 4 穆特 |如果用户未授权,则停止文件上传
【发布时间】:2014-10-17 02:51:14
【问题描述】:

我正在使用 multer 作为 express4 的多部分中间件。

Express 配置为使用护照作为身份验证中间件,但如果用户未通过身份验证,我无法找到阻止文件上传的方法。

我想使用 onFileUploadStart 来拒绝文件,但我找不到带有 "request" object 的链接,可以用它来匹配用户。

以下代码用于配置 express 与 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());   

【问题讨论】:

  • 我面临着一个类似但更广泛的问题。在某些情况下,我需要确保用户提供了有效信息,以便在文件之外完成请求。如果不是,我根本不想下载该文件。目前,当我处理请求并且它不是有效的请求时,我删除了下载的文件,但这显然不是一个好方法。试图为此找到解决方案。如果我这样做,我会让你知道。请也这样做。 =)

标签: node.js express multer


【解决方案1】:

编辑

如果有帮助,我会在下面留下答案,但答案实际上很简单:您需要将两个调用移至app.use(passport) 上方调用app.use(multer)。快速链中的每个步骤都按顺序处理,因此如果您希望拒绝错误的身份验证尝试,请在处理传入文件上传之前执行此操作。


可能有更好的方法来执行此操作,但这应该可以帮助您入门。更改您的 express 配置以使用闭包,您将拥有对 req 变量的完全访问权限。

app.use(function(req, res, next) {
  var handler = multer({
    dest: wwwroot + path.sep + 'uploaded' + path.sep, 
    onFileUploadStart: function (file) {
      // You now have access to req
      console.dir(req);
      console.log(file.fieldname + ' is starting ...')
    },
    onFileUploadComplete: function (file) {
      console.log(file.fieldname + ' uploaded to  ' + file.path)
    }
  });
  handler(req, res, next);
});

【讨论】:

  • 请注意app.use(multer) 会影响所有路由。就我而言,支持多种方法,诀窍是在身份验证功能和我的控制器功能之间插入 multer:router.post('/', auth.hasRole('admin'), multer(uploadPreferences), controller.create);
【解决方案2】:

好的,我想我为您找到了解决方案。它不是我自己问题的完整解决方案,但它适用于您的特定情况,即在下载文件之前检查用户是否通过 Passport 获得授权。

诀窍是在您的 post 处理程序中使用中间件一次做一件事。将调用第一个护照以将用户对象放入 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 并获取用户数据,但不能确保在开始下载文件之前解析所有非文件字段(因为它们在 express req 流中汇集在一起​​)

【讨论】:

  • 用 dest、limits、onFileUploadStart、onFileUploadData、onFileUploadComplete 和其他选项配置 multer 怎么样?这会放在Multer() 的括号内吗?
  • 是的。您必须为您的特定请求设置配置。我的大多数请求都需要不同的配置和处理,所以我就是这样做的。
【解决方案3】:

来自 multer api 文档“您甚至可以阻止文件上传 - 只需从事件处理程序返回 false。文件不会被处理或到达文件系统。”

【讨论】:

  • 如果我可以访问请求对象,我可以从中检查用户,那是可能的......但我没有
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 2019-09-04
  • 2016-04-22
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多