Meteor:パブリッシュとサブスクリプション


私たちは安全な方法を使ってユーザー側が直接データベースを操作しないようにすることができますが、直接データベースの内容を読み取ることができます.もし私たちがプライベートなデータストレージを保護する必要がある場合は、クライアントでCollection.find()を直接使用する必要があります.このような操作方法は実際のプロジェクトでは使用されません.このようなデータは私有性と安全性を保証できません.クライアントで自動的に更新したくないデータがある場合は、publishsubscribeをカスタマイズする必要があります.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のボタンを追加します.


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