6

如何限制文件夹,只有登录我的 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() }
});
4

2 回答 2

3

您可以尝试将文件存储在 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"));
  });
});

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

于 2012-12-25T01:19:36.773 回答
2

我会更关心为什么Meteor.user()不起作用。

几个问题:

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

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

于 2012-12-28T19:26:04.733 回答