我们能够运用平安的要领让用户端不直接操纵数据库,然则照样能够直接读取数据库内容,假如我们还须要庇护私有的数据存储,在客户端直接运用Collection.find()
,如许的操纵体式格局在现实的项目中并不会运用,如许的数据没法保证私有性和平安性。假如一些数据我们并不想自动的在客户端更新,就须要自定义publish
和subscribe
,如安在Meteor中自定义宣布与定阅形式呢?
Remove Autopublish
在 Meteor:要领掌握中我们移除了 insecure
,在这里我们须要移除autopublish
。望文生义,autopublish的意义就是meteor自动的完成数据的publish/subscribe。
meteor remove autopublish
移除今后在我们增加数据今后,页面就不再直接显现数据了。想要显现数据,我们须要运用Meteor.publish
和Meteor.subscribe
要领,让服务端关照客户端的数据更新。
宣布与定阅
publish
if (Meteor.isServer) {
Meteor.publish("languages", function () {
return Languages.find();
});
}
subsribe
if (Meteor.isClient) {
Meteor.subscribe("languages");
Template.meteor_collection.helpers({
languages: Languages.find({}, {sort: {createdAt: -1}})
});
});
在Server端运用Meteor.publish
函数注册一个”languages”的宣布者,须要在客户端对”languages”举行定阅,运用Meteor.subscribe
定阅了”languages”,如今已增加的数据就会从新出如今页面上。
应用宣布/定阅形式,我们也能够完成关于私有数据的接见。
给数据增加private
在页面上增加一个private的按钮:
<template name="other_event">
{{#each others}}
<li>
<h3>{{name}} ,{{updateAt}}</h3>
<button class="delete">delete</button>
<button class="update">update</button>
{{#unless private}}
<button class="private">private</button>
{{/unless}}
</li>
{{/each}}
</template>
增加设置为privte的要领:
Meteor.methods({
addLanguage: function (text) {
Languages.insert({
name: text,
createdAt: new Date()
});
},
updateLanguage: function (_id) {
Languages.update(_id, {
$set: {updateAt: new Date()}
})
},
removeLanguage: function (_id) {
Languages.remove(_id);
},
setPrivate: function (_id) {
Languages.update(_id, {
$set: {private: true}
})
}
});
客户端挪用设置privte的要领:
Template.other_event.events({
'click .delete': function () {
Meteor.call("removeLanguage", this._id);
},
'click .update': function () {
Meteor.call("updateLanguage", this._id);
},
'click .private': function () {
Meteor.call("setPrivate",this._id);
}
});
设置宣布的数据必需是私有的
在Meteor.publish的能够运用filter过滤掉不是改用户的,非私有的数据:
Meteor.publish("languages", function () {
return Languages.find({
$or: [
{private: true}
//auth user
//,{owner:this.userId()}
]
});
});
测试如许的数据能够运用不通的用户在不通的浏览器上面做测试,每一个用户都是只能看到本身的数据。
对删除数据的操纵做搜检
只允许用户关于本身的数据举行删除操纵
removeLanguage: function (_id) {
var language=Languages.findOne(_id);
if(language.private&&language.owner !=Meteor.userId){
throw new Meteor.Error("not-authorized");
}
Languages.remove(_id);
}
如许我们就可以保证私有数据的平安,客户端不能直接操纵数据(remove insecure),客户端也不直接接见数据库(remove autopublish),就有用的庇护私有数据的平安。
项目地点 :https://github.com/jjz/meteor/tree/master/meteor-publish