12

我有一个非常简单的应用程序,它不需要任何角色,只需一个或几个用户就可以登录和使用站点的管理员。

我正在我的管理模板中做一个简单的检查,如下所示:

<template name="admin">
{{#if currentUser}}
{{loginButtons}}
  {{#if isUserAdmin}}
     show some stuff here...
  {{/if}}
{{ else }}
{{loginButtons}}
{{/if}}
</template>

然后在我的助手中,我有:

Template.admin.isUserAdmin = function(){
  var adminEmail = Meteor.user().emails[0].address;
  if( adminEmail === "username@gmail.com"){
    return true;
  } else {
    return false;
    //add some logic for displaying error template.
  }
}

这足以保证应用程序的安全还是我还需要其他东西?

4

1 回答 1

20

这还不够。主要规则是:永远不要相信你的客户。客户端代码的任何部分都可以替换为其他任何部分 - 在您的情况下,isUserAdmin可以修改该函数以始终返回 true。

为了安全起见,您需要在服务器端放置安全过滤器。

1) 为只有管理员才能修改的数据设置写入/删除权限。见http://docs.meteor.com/#allow

2) 如果您有一些数据不应该对所有用户可见,而只对管理员可见(例如您的用户电子邮件、产品的价格历史记录、未发表的文章等),请确保在publish通话中检查权限。例如:

Meteor.publish('unpublishedArticles', function() {
    if(!this.userId) return null;
    var user = Meteor.users.findOne(this.userId);
    if(user.admin) return Articles.find({published: false});
    return null;
});

同样,重要的是数据在调用中被过滤,publish因为subscribe调用很容易被篡改。

3) 此外,将您的电子邮件直接嵌入到客户端代码中是不明智的。admin = true用字段标记特权用户会更好(并且更容易使用) 。

这些步骤应该足以使您的应用程序安全。

于 2013-07-25T05:50:04.617 回答