2013-04-30 55 views
0

我的应用程序商店使用的文件,如下面的方法:如何保护用户的文件

/app 
    |-static 
    | |-img 
    | |-css 
    | |-js 
    |-server 
    | |-models 
    | |-routes 
    |-files 
    |- 594873 
      |- file.txt 
       . 
       . 
    |- 393948 

文件夹“文件”包含用户私人文件。 594873和393948是用户ID。所以我需要为写作和阅读用户文件做一个安全的事情。在后端我使用NodeJS/express/mongoose。

我需要做这样的事情:

app.get('/getfile/:userid/:filename', function (req, res) { 
    // Return file that contains in 'userid' folder and named 'filename' 
}); 

编辑:

app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.favicon()); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.cookieParser()); 
app.use(express.session()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'static'))); 
+0

我会说:从一个系统开始认证用户,如[护照](http://passportjs.org)。之后,创建一个中间件来检查用户是否应该能够访问这些文件。 – robertklep 2013-04-30 12:39:24

+0

我有用户认证。你能提供一个用于检查文件访问的代码片段吗? – Erik 2013-04-30 13:26:34

回答

0

假设你正在使用类似的东西Passport用户进行身份验证,用户对象存储在req.user,并且该对象包含id属性,则可以创建一个检查正确访问的中间件:

var checkValidUser = function(req, res, next) { 
    if (req.user && req.user.id && req.user.id === req.params.userid) 
    { 
    // user has access, calling 'next()' will pass the request to the handler 
    next(); 
    } 
    else 
    { 
    // user doesn't have access, return an HTTP 401 response 
    res.send(401, 'Unauthorized'); 
    } 
}; 

app.get('/getfile/:userid/:filename', checkValidUser, function (req, res) { 
    // this will only be called when 'checkValidUser' allowed access to this file 
    res.sendfile('./files/' + req.params.userid + '/' + req.params.filename); 
}); 
+0

谢谢。但是,如何保护文件免受直接访问? – Erik 2013-04-30 13:40:19

+0

通过什么URL可以直接访问文件?你有'express.static'这可能能够处理这些文件吗?在这种情况下,不要使用它,并让上面的处理程序处理'files'目录中所有文件的请求。 – robertklep 2013-04-30 13:44:36

+0

我想保护以下文件:'GET http://mysite.com/files:594873/file.txt' – Erik 2013-04-30 13:49:05