如何在Express.js中提供特定于用户的静态内容

时间:2016-11-27 10:58:20

标签: node.js security express assets static-content

我想在Express中提供特定于用户的静态内容。这意味着,如果用户登录,则他的私人静态文件夹由express提供。其他用户无权访问。

我尝试了以下内容(见下文),但未提供静态内容。事实上,这条路线似乎完全被忽略了,我得到了404.

我不确定我的方式是否正确,如果express能够动态提供不同的静态文件夹。提前感谢您对此的看法。

以下是代码(简化):

routes.js:

express = require 'express'
router = express.Router()

router.use '/user/assets', (req, res, next) ->
    if req.user
        userpath = 'uploads/' + md5(req.user._id)
        if not fs.existsSync userpath
            fs.mkdirSync userpath
            console.log "Created user directory at " + userpath

        express.static(userpath)
    next()

module.exports = router

index.js:

express = require 'express'
app = express()
app.use '/', require './routes'

图片的标题说明

md5只是一种在用户id中转义奇怪字符的方法,这是一个字符串。我知道有一种不匹配的可能性,这种情况很小,我现在不想关心它。关于解决尝试的时尚的一般安全性的担忧是值得赞赏的。 代码是用CoffeeScript编写的。

req.user包含有效的用户元素。

1 个答案:

答案 0 :(得分:3)

仅仅呼叫express.static是不够的,您需要使用路由器use()。遗憾的是,您不能直接这样做,因为您需要为每个用户提供不同的路由集。

调用express.static将返回中间件功能。你可以直接调用它,例如:

var files = express.static(userpath);
return files(req, res, next);

然而,由于中间件使用req.url来构建文件路径,因此仍然不够。 express路由器调整此属性并删除挂载点(请参阅文档中的req.originalUrl)。因此,在调用中间件之前,您需要从中删除/user/assets

顺便说一句,您应该为节点设置DEBUG环境变量。它允许您查看express创建的路由,这在调试express.static 404问题时非常方便。例如。你在Linux上做$ DEBUG=* node index.js

正如您所看到的那样,该方法开始变得有点笨拙,并且在每个请求上创建一个新的express.static中间件也不是非常友好。因此,根据您的用户目录包含的内容,使用res.sendFile可能实际上更好。

作为旁注,我假设您已检查req.user实际上是否包含用户登录的内容。