【问题标题】:Preventing access to a page in Meteor阻止访问 Meteor 中的页面
【发布时间】:2015-10-23 07:49:58
【问题描述】:

我正在流星中构建一个应用程序,其中一个页面只有在用户登录时才对用户可见。该页面的链接位于导航标题中,我希望在用户登录时显示一个登录对话框在没有登录的情况下点击链接。这是显示对话框的代码:

<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() 检查可以很容易地从浏览器控制台绕过使用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 在浏览器中被修改,这个检查也不起作用。 处理这种情况并防止页面显示的最佳方法是什么。

【问题讨论】:

  • 您可能不需要阻止用户看到“创建帖子”页面,您只需要阻止用户使用它来创建帖子即可。这意味着您的方法中的授权(或允许/拒绝规则)。即使他们看不到“创建帖子”页面,如果没有对该方法的授权,他们仍然可以通过手动调用该方法来创建帖子。

标签: authentication meteor iron-router


【解决方案1】:

没有办法确保客户不会看到给定的页面。

即使您最终提出了很多技巧,客户端也会收到所有模板并且他仍然可以访问它,无论是使用他的浏览器控制台还是通过更高级的技巧。

您想要的是阻止用户查看和操作数据,这是一种验证,必须在服务器端进行以确保安全,并且可以在客户端进行以更好地感受用户。
例如,在出版物中:

Meteor.publish('userData', function() {
  if(!this.userId) {
    throw new Meteor.Error('user not logged-in');
  }
  //...
});

您必须确保在正常、合法地使用您的应用程序中,一切运行正常,客户可以看到他可以看到的内容,并提示他需要提示的内容(此处, “请登录”)。

如果客户想搞砸,让他的页面被破坏。

【讨论】:

  • 是的。每次您真的不希望用户看到某些静态模板时,您可以对服务器进行方法调用(用户的真实性不能被欺骗),但我不'不知道有多少 JS 应用到了这种程度。即使在那种情况下,我认为用户可以在客户端覆盖方法定义。无论如何,这一切只会增加复杂性以及安全感。
【解决方案2】:

我同意其他答案:如果您真的想锁定应用程序,那么您还需要考虑服务器端控件。

对于安全性要求较低的应用,我通常使用iron-router 执行与您的代码类似的操作:

Router.route('/', {
    name: 'home',
    template: 'home',
    onBeforeAction: function(){
     var currentUser = Meteor.userId();
     if(currentUser){
         this.next();
     } else {
         this.render("login");
     }
   }
}); 

我在控制台上用你的 hack 进行了测试,它可靠地一直重定向到“登录”,但登录屏幕本身(我正在使用 accounts-uiaccounts-password)然后中断,因为你无法注销 Null 用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2017-08-01
    • 2015-03-09
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多