用流星铁管理登录:路由器

Cer*_*ler 2 meteor iron-router

我在meteor.js app中创建了一个私有区域; 使用铁路由器,我已经定义了一个控制器,每个私有路由使用:

panelController = RouteController.extend({
    waitOn: function() {
        Meteor.call('panelAuth', function(error, auth) {
            if (!auth) Router.go('/panel/login');
        });     
    }
});
Run Code Online (Sandbox Code Playgroud)

这允许您仅在通过方法'panelAuth'获得服务器端授权时才能输入;

它工作得很好但是如果你尝试在浏览器的地址栏中键入私有路由的url而没有登录(或者没有所需的权限记录)一段时间你可以看到路由呈现,然后你被重定向到登录页面;

我想显示一个loadingTemplate,而'panelAuth'决定你是否可以访问,并避免显示私有路由一段时间

cob*_*boy 5

我确信你知道,你对Meteor.call的调用是异步的.您的路由正在客户端中呈现,然后异步调用返回,从而导致重新路由.

你试过用过onBeforeAction吗?这就是它的用途.虽然我怀疑如果你坚持使用异步方法调用你仍会遇到问题.

Router.onBeforeAction(function() {
  if (! Meteor.userId()) {
    this.render('login');
  } else {
    this.next();
  }
});
Run Code Online (Sandbox Code Playgroud)

由于客户端可以看到您的所有模板(无论您的安全模型如何),我都会将注意力集中在保护出版物上.您可以在登录时存储会话变量,指示是否应将用户路由到目标,并对数据发布提供更强大的检查.

这是一个示例流星应用程序,使用铁:路由器,帐户密码和帐户ui.

HTML:

<head>
  <title>Login with Meteor</title>
</head>

<body>
</body>

<template name="hello">
  <h3>Hello</h3>
  {{> loginButtons}}
  <p><a href="{{pathFor 'blah'}}">Blah</a></p>
</template>

<template name="blah">
  <h1>BLAH!!!! YOU SAW ME!!!</h1>
</template>

<template name="login">
  username: <input type="text" name="username" id="username"/><br/>
  password <input type="password" name="password" id="password"/><br/>
  <button id="loginSubmit">Submit</button>
</template>
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

// default page
Router.route('/', function () {
  this.render('hello');
});

// secure page, requires login.
Router.route('/blah', {
  onBeforeAction: function () {
    if (!Meteor.userId()) {
      this.render('login');
    } else {
      this.next();
    }
  }
});

// handle login, go to /blah if successful
if (Meteor.isClient) {
  Template.login.events({
    'click #loginSubmit': function () {
      var username = $("#username").val();
      var password = $("#password").val();
      Meteor.loginWithPassword(username, password, function(error){
        if (!error) {
          Router.go('/blah');
        } else {
          alert("Errrrrrrrrrooooooorrrrr");
        }
      });
    }
  });
}
Run Code Online (Sandbox Code Playgroud)