我正在meteor.js app中创建一个私有区域;使用铁路由器,我已经定义了一个控制器,每个私有路由使用:
panelController = RouteController.extend({
waitOn: function() {
Meteor.call('panelAuth', function(error, auth) {
if (!auth) Router.go('/panel/login');
});
}
});
这允许您仅在通过方法'panelAuth';
获得服务器端授权时才能输入它的效果相当不错但是如果你尝试在浏览器的地址栏中键入私有路由的url而没有登录(或者没有所需的权限记录)一段时间你可以看到路由呈现,然后你被重定向到登录页面;
我想展示loadingTemplate,而'panelAuth'决定你是否可以访问,并避免显示私有路线一段时间
答案 0 :(得分:5)
我确定你知道,你对Meteor.call的调用是异步的。您的路由正在客户端中呈现,然后异步调用返回,从而导致重新路由。
您是否尝试过使用onBeforeAction
?这就是它的用途。虽然我怀疑如果你坚持使用异步方法调用,你仍然会遇到问题。
Router.onBeforeAction(function() {
if (! Meteor.userId()) {
this.render('login');
} else {
this.next();
}
});
由于客户可以看到您的所有模板(无论您的安全模式如何),我都会集中注意保护这些出版物。您可以在登录时存储会话变量,指示是否应将用户路由到目标,并对数据发布提供更可靠的检查。
这是一个示例流星应用程序,使用iron:router,accounts-password和accounts-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>
使用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");
}
});
}
});
}