11

我用

Accounts.config({
    sendVerificationEmail: true, 
    forbidClientAccountCreation: false
})

在创建用户时发送电子邮件验证。但是,当用户注册时,他们在验证邮件之前被允许进入产品,这是我不想要的。

我尝试通过创建一个模板变量来破解它,该变量在验证用户时为真,但用户信息在模板渲染后到达,甚至使用 Meteor。setTimeout() 数据到达时我无法更新模板。

对正确的方法有什么建议吗?

发送

4

2 回答 2

16

要完全阻止他们登录,您可以这样做:

Meteor.startup(function() {
  if (Meteor.isServer) {
    var loginAttemptVerifier = function(parameters) {
      if (parameters.user && parameters.user.emails && (parameters.user.emails.length > 0)) {
        // return true if verified email, false otherwise.
        var found = _.find(
                           parameters.user.emails, 
                           function(thisEmail) { return thisEmail.verified }
                          );

        if (!found) {
          throw new Meteor.Error(500, 'We sent you an email.');
        }
        return found && parameters.allowed;
      } else {
        console.log("user has no registered emails.");
        return false;
      }
    }
    Accounts.validateLoginAttempt(loginAttemptVerifier);
  }
});
于 2014-07-24T17:47:01.597 回答
9

首先,你需要让你的数据“不可破解”,看看发布功能:http ://docs.meteor.com/#meteor_publish

因此,在您的产品的 Meteor.publish 函数中,您应该执行以下操作:

这确保客户只有在登录并拥有经过验证的帐户时才能看到产品。他们仍然可以登录,但在他们的帐户得到验证之前看不到产品

服务器js

Meteor.publish("productinfo", function () {
  user = Meteor.users.findOne({_id:this.userId})
  if(user) {
      if(user.emails[0].verified) {
          //You can put some extra logic in here to check which product the user has, if you're selling or something like that
          return Products.find({});
      }
   }
});

请记住,您需要删除autopublish哪个流星使用以使生活更轻松,它基本上将所有集合发布给用户,但您想限制某些信息,因此您应该删除它

其次,您需要处理模板上的数据,以便如果用户未登录模板,则内容不可见。因此,即使在浏览器最初加载的那一步中,他们也不会看到产品

客户端JS

Meteor.subscribe("productinfo");

Template.products.products = function() {
  if(Meteor.userId()) {
    if(Meteor.user().emails[0].verified) {
        return Product.findOne({_id:"your product id"});
    }
  }
}

这样,模板助手会检查用户是否已登录并且他们是否拥有经过验证的帐户。此外,如果在客户端更改了代码,由于发布功能,他们将看不到产品。

于 2013-03-13T11:28:09.453 回答