我有一个非常简单的应用程序,只需要一个或多个用户就可以登录和使用网站的管理员。
我正在我的管理模板中进行简单的检查,如下所示:
<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.
}
}
这足以让应用程序保持安全,还是我还需要其他东西?
答案 0 :(得分:20)
这还不够。主要规则是:永远不要相信您的客户。客户端代码的任何部分都可以替换其他任何内容 - 在您的情况下,可以修改isUserAdmin
函数以返回始终为真。
为安全起见,您需要在服务器端安装安全过滤器。
1)为只允许管理员修改的数据设置写入/删除权限。见http://docs.meteor.com/#allow
2)如果您有一些不应该对所有用户可见的数据,但仅限于管理员(例如您的用户电子邮件,产品的价格历史记录,未发布的文章等),请务必检查{{}中的权限1}}打电话。例如:
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
来电可能很容易被篡改。
3)此外,将您的电子邮件直接嵌入客户端代码中并不明智。使用subscribe
字段标记特权用户会更好(并且更容易使用)。
这些步骤应足以确保您的应用安全。