如何保护文件目录并仅允许经过身份验证的用户访问这些文件?

时间:2012-12-25 01:04:07

标签: meteor

如何限制文件夹,只有登录Meteor应用程序的人才能下载文件?

我研究了多种方法,但主要问题是我无法访问(我得到null。):

Meteor.user() or this.userId()

我试过了:

__meteor_bootstrap__.app
    .use(connect.query())
    .use(function(req, res, next) {
        Fiber(function () {  

          // USER HERE?

        }).run();
    });

__meteor_bootstrap__.app.stack.unshift({

    route: "/protected/secret_document.doc", // only users can download this

    handle: function(req, res) { Fiber(function() {

        // CHECK USER HERE ?

        // IF NOT LOGGED IN:
        res.writeHead(403, {'Content-Type': 'text/html'});
        var content = '<html><body>403 Forbidden</body></html>';
        res.end(content, 'utf-8');
    }).run() }
});

2 个答案:

答案 0 :(得分:3)

你可以try storing the files in mongodb,这意味着它们会被挂钩到你的收集系统中,并且可以在客户端和服务器上查询。然后,只需将相关数据发布给特定用户的客户端,或使用Meteor.methods以这种方式公开信息。

示例:

假设文件存储在MongoDB中,我们首先将它们发布到客户端:

Meteor.publish("files", function(folder) {
  if (!this.userId) return;
  // the userHasAccessToFolder method checks whether
  // this user is allowed to see files in this folder
  if (userHasAccessToFolder(this.userId, folder))
    // if so, return the files for that folder
    // (filter the results however you need to)
    return Files.find({folder: folder});
});

然后在客户端上,我们会自动订阅已发布的频道,以便每当它发生变化时,它都会刷新:

Meteor.startup(function() {
  Meteor.autosubscribe(function() {
    // send the current folder to the server, 
    // which will return the files in the folder
    // only if the current user is allowed to see it
    Meteor.subscribe("files", Session.get("currentFolder"));
  });
});

NB。我没有测试上面的代码,所以考虑它伪代码,但它应该指向你解决这个问题的大方向。困难的部分是将文件存储在mongodb!

答案 1 :(得分:2)

我更关心为什么Meteor.user()无效。

几个问题:

  • 你是流星0.5.0吗?
  • 您是否已将accounts-base添加到您的流星项目中?
  • 您是否使用过meteor的登录系统(accounts-passwordaccounts-facebook等)? (可选 - accounts-ui易于使用?)
  • 你还有自动发布吗?或者您是否正确设置了发布/订阅?

Meteor.user()应该是当前用户,Meteor.users应该是所有以前登录用户的Meteor集合。