Meteor:パブリッシュとサブスクリプション
3758 ワード
私たちは安全な方法を使ってユーザー側が直接データベースを操作しないようにすることができますが、直接データベースの内容を読み取ることができます.もし私たちがプライベートなデータストレージを保護する必要がある場合は、クライアントで
Remove Autopublish
Meteor:メソッド制御では
meteor remove autopublish
削除後、データを追加すると、ページに直接データが表示されなくなります.データを表示するには、
パブリケーションとサブスクリプション
publish
subsribe
サーバ側で
データにprivateを追加
ページにprivateのボタンを追加します.
privteに設定する方法を追加します.
クライアント呼び出しprivteの設定方法:
パブリッシュされたデータをプライベートに設定する必要があります
Meteorでpublishはfilterを使用して、ユーザーを変更するのではなく、プライベートではないデータをフィルタリングすることができます.
このようなデータをテストするには、不通のユーザーを使用して不通のブラウザでテストすることができ、各ユーザーは自分のデータしか見えません.
データの削除操作をチェックする
ユーザーのみが自分のデータを削除できます
これにより、プライベートデータのセキュリティを保証することができ、クライアントはデータ(remove insecure)を直接操作することができず、クライアントもデータベース(remove autopublish)に直接アクセスすることなく、プライベートデータのセキュリティを効果的に保護することができます.
プロジェクトのアドレス:https://github.com/jjz/meteor/tree/master/meteor-publish
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}})
});
});
サーバ側で
Meteor.publish
関数を使用してlanguagesのパブリッシャーを登録するには、クライアントでlanguagesを購読する必要があります.Meteor.subscribe
を使用してlanguagesを購読すると、追加したデータがページに再表示されます.パブリケーション/サブスクリプションモードを使用すると、プライベートデータへのアクセスも実現できます.データにprivateを追加
ページにprivateのボタンを追加します.
{{#each others}}
{{name}} ,{{updateAt}}
{{#unless private}}
{{/unless}}
{{/each}}
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