Meteor - 未登录时发布/订阅用户数据

时间:2014-03-20 16:44:09

标签: javascript meteor

我已经搜索并阅读了与Meteor的pub / sub功能相关的几乎所有问题,但似乎无法找到直接解决我问题的答案。

我正在学习Meteor并希望创建以下内容;

用户访问某个页面并显示一个输入框,他们输入了他们的用户名,如果是有效的用户名,我会用密码输入字段显示它们。

我似乎遇到的问题是我无法访问Meteor.users集合,除非我已登录(自动发布和不安全的软件包已被删除)。

所以我的问题是2折;

是否可以在不登录的情况下访问Meteor.users.find({username:'输入框的值'})?

如果是这样,我需要做什么?

以下是我在下面编写代码的方法;

/server/publications.js:

Meteor.publish("staff", function () {
  return Meteor.users.find();
});

/lib/router.js:

Router.configure({
  layoutTemplate: 'layout'
});


Router.map(function() {
  this.route('home', {path: '/', data: function() {return Meteor.subscribe('staff');} });
});

/client/views/home/home.js:

Template.home.events({
  'submit form': function(e) {
  e.preventDefault();
  var guest = $("input#name");
  var staffMember = Meteor.users.findOne({username: $(guest).val()});
});

除非我以任何用户身份登录,否则Meteor.users.find()。fetch()始终返回一个空数组。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您正在向所有人发布所有用户数据,现在您只需要将其包含在内:

Deps.autorun(function(){
  Meteor.subscribe('staff');
});

也就是说,确保在此类订阅中您只发布非敏感用户数据,因为每个人都可以看到它。理想情况下,为此目的创建另一个订阅,并通过fields param。

过滤用户名

答案 1 :(得分:1)

您要发布在客户端上可见的所有用户。这不是一个非常安全的位置,因为所有用户数据都将在所有客户端上可见。解决问题的实用方法是允许用户仅查看有限数量的用户,即发布一组不同的用户,具体取决于userId

正如@ Hubert在下面的回答所示,您还需要订阅到客户端上的发布,以实际获取已发布的帐户。


您可以通过在服务器上创建Method call来检查有效性安全

<强> /server/methods.js:

Meteor.method({
    validUserName: function (userName) {
        check(userName, string);
        // You have access to Meteor.users here.
        // This assumes that mere existence of a user with the same username will
        // render the entered username invalid. If there are more checks you want to
        // make, they should be made here.
        return !!Meteor.users.find({username: userName});
    }
});

<强> /client/views/home/home.js:

Template.home.events({
  'submit form': function(e) {
  e.preventDefault();
  var guest = $("input#name");
  var userNameEntered = $(guest).val();

  Session.set('requestInProgress', true);

  Meteor.call('validUserName', function (isUserNameValid) {
       Session.set('requestInProgress', false);
       // ... take action here.
  });
});