我正在meteor中构建一个应用程序,其中一个页面仅在用户登录时才对用户可见。该页面的链接位于导航标题中,我希望在用户显示登录对话框时点击链接而不登录。以下是显示对话框的代码:
<template name="header">
<a href="#" id="createPost">Create Post</a>
</template>
Template.header.events({
"click #createPost": function (evt) {
evt.preventDefault();
if(!Meteor.user()) {
$('#myModal').modal("show"); //bootstrap modal dialog
}else{
Router.go('/createPost');
}
}
}
然而,问题是可以使用Meteor.user = function(){return true;}
我尝试检查路由中的Meteor.user()并抛出异常,如下所示:
Router.route('/createPost', function () {
if (!Meteor.user()) {
throw new Meteor.Error(500, 'You are not logged in.');
}
this.render('newbag');
});
但是,一旦在浏览器中修改了Meteor.user,此检查也不起作用。 处理此案例并阻止页面显示的最佳方法是什么。
答案 0 :(得分:3)
无法确保客户端看不到给定的页面。
即使你最终提出了许多技巧,客户端也会收到所有模板,他仍然可以使用浏览器控制台或更高级的技巧来访问它。
你想要的是阻止用户查看和操作数据,这是一个必须在服务器端进行安全验证的验证,并且可以在客户端完成,以便更好地感受到用户。
例如,在出版物中:
Meteor.publish('userData', function() {
if(!this.userId) {
throw new Meteor.Error('user not logged-in');
}
//...
});
您必须确保的是,在<正常,合法使用您的应用程序中,一切运行正常,客户看到他能看到的内容,并提示他需要提示的内容(此处, “请登录”)。
如果客户试图搞砸了,让他打破他的页面。
答案 1 :(得分:0)
我同意其他答案:如果你真的想要锁定一个应用程序,那么你也需要考虑服务器端控件。
对于需要较低安全性的应用,我通常使用iron-router
执行与您的代码类似的操作:
Router.route('/', {
name: 'home',
template: 'home',
onBeforeAction: function(){
var currentUser = Meteor.userId();
if(currentUser){
this.next();
} else {
this.render("login");
}
}
});
我在控制台上测试了你的hack并且它可靠地保持重定向到'login',但登录屏幕本身(我正在使用accounts-ui
和accounts-password
)然后中断,因为你无法注销空用户。