仅在电子邮件和密码正确的情况下签署用户?

时间:2014-03-02 02:35:25

标签: javascript html meteor account iron-router

我有一个表单,当您单击提交时,无论如何都会转到路径/ signin,即使您没有在表单中输入任何内容。但是,我想要检查是否有用户输入了电子邮件,并且在进入/ signin之前他们的密码是否正确。如果电子邮件未知或密码不正确,那么我希望它显示错误(并保留在登录页面中)。我一直试图让这个工作,但我不知道该怎么做。有谁知道如何做到这一点?这是我到目前为止的代码:

HTML:

<div id="topbar">
  <h1><strong>chattly</strong></h1>
        {{#unless currentUser}}
            {{> signIn}}
            {{> alert}}
        {{else}}
            {{> signOut}}
        {{/unless}}
    </div>

的javascript:

// Sign In Template
Template.signIn.events({
    'submit #signInForm': function(e, t) {
        e.preventDefault();

        var signInForm = $(e.currentTarget),
            email = trimInput(signInForm.find('.email').val().toLowerCase()),
            password = signInForm.find('.password').val();

        if (isNotEmpty(email) && isEmail(email) && isNotEmpty(password) && isValidPassword(password)) {
            Meteor.loginWithPassword(email, password, function(err) {
                if (err) {
                    Session.set('alert', 'We\'re sorry but these credentials are not valid.');
                } else {
                    Sesson.set('alert', 'Welcome back New Meteorite!');
                }
            });
        }
        return false;
    },
});

1 个答案:

答案 0 :(得分:1)

你用铁路由器标记了这个,所以我假设你正在使用铁路由器包。

您可以通过在限制页面的所有路由上使用挂钩之前防止未经身份验证的用户访问登录页面之外的任何页面。 before hook会检查Meteor.user()如果它没有返回一个对象,那么没有用户登录,它可以重新路由到登录页面。

查看铁路由器文档,这里是钩子之前和之后的部分。它甚至显示使用before hook作为过滤器来防止未经过身份验证的用户进入路由。

https://github.com/EventedMind/iron-router/#before-and-after-hooks

它看起来像这样:

Router.map(function () {
  this.route('postShow', {
    path: '/posts/:_id',

    before: function () {
      if (!Meteor.user()) {
        // render the login template but keep the url in the browser the same
        this.render('login');

        // stop the rest of the before hooks and the action function 
        this.stop();
      }
    },

    action: function () {
      // render the main template
      this.render();

      // combine render calls
      this.render({
        'myCustomFooter': { to: 'footer' },
        'myCustomAside': { to: 'aside' }
      });
    },

    after: function () {
      // this is run after our action function
    }
  });
});