阻止访问Meteor中的页面

时间:2015-07-31 15:04:39

标签: authentication meteor iron-router

我正在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()检查

我尝试检查路由中的Meteor.user()并抛出异常,如下所示:

  Router.route('/createPost', function () {
        if (!Meteor.user()) {
            throw new Meteor.Error(500, 'You are not logged in.');
        }
        this.render('newbag');
    });

但是,一旦在浏览器中修改了Meteor.user,此检查也不起作用。 处理此案例并阻止页面显示的最佳方法是什么。

2 个答案:

答案 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-uiaccounts-password)然后中断,因为你无法注销空用户。