【问题标题】:upload files and request protected download node.js上传文件并请求受保护的下载 node.js
【发布时间】:2018-10-04 06:02:00
【问题描述】:

我有一个使用 node.js、express 和 multer 上传文件的系统,文件存储在静态目录中。我想要的是将它们存储在服务器上,并且只有在我登录后才能看到它们。

问题:

我的上传系统很好,但我需要保护目录 /files/documents/hv.pdf 中的文件,因为每当我输入打开文件的 url 时,浏览器都会保存历史记录,这是不应该发生的事情,如果用户没有登录,如何避免访问?

我正在尝试使用一个中间件,如果 url 的字符串带有 /files 文件夹的名称,它会运行,有趣的是,如果我不输入文件名或输入另一个名称,如 /files/document/test.txt 它可以工作但不是当我访问静态文件夹中的链接时,我以为是缓存但绝对不是那个

这个中间件

module.exports = (req,res,next)=>{
    let regex = /^\/files\/.*$/;
    if (!regex.test(req.url)) { return next(); }

    // for test
    req.session.user = {name:"thaylor"}; //comment for not session
    //fin for test

    if(req.session.user){
        next();
    }else{
        res.end('You are not allowed!');
    }
}

更新,这个解决方案 2018-04-2017

获取根路径和受保护路由 app.js 的中间件

const protectedfile = require("./controllers/protectedfile");

app.use(function(req, res, next) {
    req.rootPath = __dirname;
    next();
});

app.use('/files', protectedfile);
app.use('/files', express.static(path.join(__dirname, 'files')) );

这个文件控制器/protectedfile.js

const path = require('path'); 
module.exports = (req,res,next)=>{
    if(!req.session.user){
        res.send("Route protected");
    }else{          
        let file = path.join(req.rootPath, req.originalUrl);  
        res.download(file, function (err) {
            if (err) {
                console.log("Error");
                console.log(err);
            } else {
                console.log("success"); 
            }        
        });       
    }
}

谢谢大家

【问题讨论】:

  • 当然不会,static 文件夹是......好吧应该是静态的。也就是说您不想将文件上传到您的静态文件夹(通常命名为public。您可以创建一个名为upload 的文件夹并设置app.set('upload', uloade_path) 并用作req.app.get('upload')
  • 我不明白你的解决方案
  • 下面看我的详细解释。希望能解决您的问题:)

标签: node.js express directory protected multer


【解决方案1】:
var express = require("express");
var path = require( "path" );
var app = express();

app.use( '/upload', isLoggedIn, express.static( path.join( __dirname, '**your upload folder name**' ) ) );

app.listen( 3000 );

//Use this code if you are using passport.js for authentication mech.
function isLoggedIn(req, res, next) {
    if (req.user) {
        next();
    } else {
        res.redirect('/login');
    }
}

//Use this code for custom sign in implementation
function isLoggedIn(req, res, next) {
    //check if user is logged in
    // your business logic goes here
    if ( condition ) {
        next();
    } else {
        res.redirect('/login');
    }
}

每次调用 localhost:3000/upload/* 都会通过 isLoggedIn 函数执行此操作。

【讨论】:

  • 当我将pdf文件发送给用户时,“如果用户登录让他下载”在文件处于静态路由时不起作用,它总是让你看到它是否无关紧要是否登录
【解决方案2】:

在我深入细节之前,需要记住的一点是,Express.js 框架中的所有内容都被视为一个中间件。所以你的代码顺序很重要(即你的app.use 是如何按顺序连接的)。每次客户端访问您的应用程序时,都会从您的 app.js 文件的顶部开始,直到可以返回某些内容。

首先,静态路由意味着通过该给定路径(文件夹)传递的内容是静态的。通常,在app.js 文件的头文件中,有:

app.use(express.static('./public', options));

在上面的代码中,文件夹“public”设置为静态。也就是说,放入此文件夹的任何内容(包括放入其子文件夹的文档)对公众完全透明,因此您无需指定放入此文件夹的内容。当客户端尝试向您的服务器发出 HTTP 请求时,Express 将扫描文件夹并在找到请求的文件后返回文档;如果没有,那么它会通过你的下一个app.use

您可以分配多个静态路由。例如,如果您现在在上述代码之后附加以下代码:

app.use(express.static('./file', options));

您的服务器现在将扫描以“文件”命名的文件夹之后在“./public”路径中找不到任何内容,并尝试找出请求的文档。基本上,做和上面一样的事情。

你可以通过替换上面的代码来玩这个技巧:

app.use('/file', checkIfTheUserHaveLogIn);
app.use('/file', express.static('./file', options));

或一行:

app.use('/file', checkIfTheUserHaveLogIn, express.static('./file', options));

在这里,我使用'/file' 作为app.use 中的第一个参数来指定URL 中必须匹配的特殊路径。注意,checkIfTheUserHaveLogIn 是一个中间件函数,它作为控制器(函数)来决定是否允许客户端访问下一级中间件(通过调用next()),即express.static('./file', options)。如果客户端没有被授予该权限,您可以将客户端重定向到登录页面或在checkIfTheUserHaveLogIn 中执行其他操作。

在您的代码中,您设置了一个路由器来屏蔽“/file”路由路径以执行您的身份验证。但是,因为中间件的顺序很重要。其实就是先触发静态路由器,然后就可以找到文件了,这样文件就已经返回给请求的客户端了。您的中间件实际上从未被访问过。为了避免这种情况,只需按照我之前的做法,设置另一个静态路由并指向另一个文件夹(不能是第一个透明静态路由器下的子文件夹,即不在我的示例中的 ./public 下)。那么它应该可以完美运行。

希望我的解释能澄清你的问题。

【讨论】:

  • 好过了一会儿我解决了几个问题,其中一个是获取根目录,因为我管理安全的文件在驱动程序文件夹中,所以使用此帮助 [链接](stackoverflow.com/a/31917632/4650557) 来解决它是最好的选择。非常感谢你的帮助,除了你的解释帮助我理解了很多事情,我纠正了我的代码中的很多事情
  • 很高兴听到您的改进!既然您提到了安全性,顺便说一句,如果您想设置一个全局内容安全策略(CSP),您可以编写一个中间件,并在您的app.js 文件的最顶部使用它,因此您的所有客户端都会得到响应与全球 CSP 规则。如果您不知道什么是 CSP,您可以 google 了解更多信息。
  • 如果用户通过身份验证并被授予对公共文件夹/子文件夹的权限,那么他也将被授予对其他用户文件的权限。没有?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多