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'决定你是否可以访问,并避免显示私有路由一段时间
我确信你知道,你对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)
| 归档时间: |
|
| 查看次数: |
1375 次 |
| 最近记录: |