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

Meteor 如何保护文件目录并只允许经过身份验证的用户访问文件?,meteor,Meteor,我如何限制文件夹,以便只有那些登录到我的Meteor应用程序的人才能下载文件 我研究了多种方法来实现这一点,但主要问题是,我无法访问(我得到null): 我试过: __meteor_bootstrap__.app .use(connect.query()) .use(function(req, res, next) { Fiber(function () { // USER HERE? }).run(); });

我如何限制文件夹,以便只有那些登录到我的Meteor应用程序的人才能下载文件

我研究了多种方法来实现这一点,但主要问题是,我无法访问(我得到
null
):

我试过:

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

          // USER HERE?

        }).run();
    });

\uuuuuuuuMeteor\uuubootstrap\uuuuuuu.app.stack.unshift({
路由:“/protected/secret\u document.doc”//只有用户才能下载此文件
句柄:函数(req,res){Fiber(函数(){
//在这里检查用户?
//如果未登录:
res.writeHead(403,{'Content-Type':'text/html'});
var内容='403禁止';
res.end(内容为“utf-8”);
}).run()}
});
您可以,这意味着它们将连接到您的采集系统中,并可在客户端和服务器上查询。然后,只需为特定用户将相关数据发布到客户端,或者使用Meteor.methods以这种方式公开信息

示例:

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

Meteor.publish(“文件”,函数(文件夹){ 如果(!this.userId)返回; //userHasAccessToFolder方法检查 //允许此用户查看此文件夹中的文件 if(userHasAccessToFolder(this.userId,文件夹)) //如果是,请返回该文件夹的文件 //(根据需要过滤结果) 返回文件。查找({folder:folder}); }); 然后在客户机上,我们自动订阅已发布的频道,以便在频道发生更改时刷新:

Meteor.startup(函数(){ Meteor.autosubscribe(函数(){ //将当前文件夹发送到服务器, //将返回文件夹中的文件 //仅当允许当前用户查看时 Meteor.subscribe(“文件”,Session.get(“当前文件夹”); }); });
注意。我还没有测试过上面的代码,所以考虑它是伪代码,但是它应该指向你解决这个问题的总体方向。最难的部分是在mongodb中存储文件

我更关心的是为什么
Meteor.user()
不工作

有几个问题:

  • 你在流星0.5.0上吗
  • 您是否已在meteor项目中添加了
    帐户库
  • 您是否使用过meteor的登录系统(
    帐户密码
    帐户facebook
    ,等等)?(可选-
    帐户用户界面
    以便于使用?)
  • 你还有自动发布功能吗?或者您是否正确设置了发布/订阅

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

我如何将文件发布为XML或JSON而不呈现其余模板内容?你是什么意思?如果您的文件位于mongo中,您可以使用collection API从数据库中检索它(如果您允许访问)。例如,
Files.find({filename:“myfile.jpg”})也许你可以发布一个例子?问题是我无法控制访问。这花了一些时间,但我发布了一个示例!在邮件列表和问题跟踪讨论中有一些迹象表明,这是Meteor正在朝着的方向发展,并可能成为框架推荐的解决此类问题的方法。嘿,谢谢你的回答。Auth在应用程序内部工作得非常好。但是当我直接请求其中一个文件时,auth无法检查用户是否登录。从我尝试过的情况来看,在大多数情况下,我得到的是“”Meteor.userId只能在方法调用中调用。在发布函数中使用此.userId。“”当然,我用多种方法尝试了“.userId”。如果auth在主应用程序中工作正常,您可以尝试使用类似的方法-您可以检查url参数以查看文件是否存在,并检查登录用户是否具有正确的权限,将标题设置为正确的内容类型,然后读取并交付文件(就像普通的node.js http服务器一样),老实说,这不是一个很好的解决方案——它不能很好地处理大型文件,而且感觉像是一种解决方法。我将为它输入一个特性请求,如果失败,我将为它编写一个模块。(我宁愿它是内置的-感觉它应该是核心meteor服务器的一部分)谢谢stef,如果你不介意的话,你能把功能请求链接到这里吗?
__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() }
});