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