Meteor Reactを翻訳してTodos-10-メソッドを作成するセキュリティ
3260 ワード
メソッドのセキュリティ
この手順の前に、このアプリケーションの任意のユーザーはデータベースの任意の部分を変更することができます.非常に興味深い小さなプロジェクトやプレゼンテーションプロジェクトでは良いかもしれませんが、実際のアプリケーションではこれらのデータを権限制御する必要があります.Meteorでは、メソッドを宣言することが最善の方法です.これにより、クライアントのコードを直接置き換えます.これらの方法を
insert
、update
、remove
と呼び、実行する方法を置き換えます.ユーザーがこのような一連の操作を完了する権限があるかどうかを確認します.その後、クライアントで行われたクライアントへの変更は、データベースに送信されます.削除insecure
新しく作成された各Meteorプロジェクトには、
insecure
パッケージがデフォルトで追加されています.このパッケージでは、クライアントからデータベースを編集できます.製品の原型を作るときにこのバッグはとても役に立ちますが、今はこのスペアタイヤを消さなければなりません.このパッケージを削除するには、ディレクトリの下で実行する必要があります.meteor remove insecure
このパッケージを削除してからこのアプリケーションを使用してみると、入力ボックスやボタンが使えなくなります.これは、すべてのクライアント・データベースの権限が取り消されたためです.今、私たちのアプリケーションでいくつかの方法を使用して一部を書き換える必要があります.
いくつかの方法を定義します
まず、各データベースがクライアントで実行したいすべての操作を定義する方法が必要です.これらの方法は、クライアントとサービス側で同時に実行できるコードで定義する必要があります.「楽観的なインタフェース」というタイトルの章では、後で議論します.
// simple-todos-react.jsx
React.render(, document.getElementById("render-target"));
});
}
//
Meteor.methods({
addTask(text) {
//
if (! Meteor.userId()) {
throw new Meteor.Error("not-authorized");
}
Tasks.insert({
text: text,
createdAt: new Date(),
owner: Meteor.userId(),
username: Meteor.user().username
});
},
removeTask(taskId) {
Tasks.remove(taskId);
},
setChecked(taskId, setChecked) {
Tasks.update(taskId, { $set: { checked: setChecked} });
}
});
//
今、私たちはいくつかの方法を定義しました.私たちはいくつかの場所を更新する必要があります.デフォルトではなく、定義したばかりの方法でデータベースを操作します.
// App.jsx
// React ref
var text = React.findDOMNode(this.refs.textInput).value.trim();
//
Meteor.call("addTask", text);
//
// Clear form
React.findDOMNode(this.refs.textInput).value = "";
// Tasks.jsx
toggleChecked() {
//
//
Meteor.call("setChecked", this.props.task._id, ! this.props.task.checked);
},
deleteThisTask() {
//
Meteor.call("removeTask", this.props.task._id);
},
render() {
今、私たちの入力とボタンはまた使えます.私たちはこれらの仕事から何を得ましたか.
createdAt
フィールドが正しいかどうか、owner
フィールドとusername
フィールドが正しいかどうかを安全に検証できます.一人のユーザーは誰の真似もできない.setChecked
およびdeleteTask
に、後続のステップで追加の検証ロジック楽観的なUI
では、なぜサービス側とクライアントで独自の方法を定義するのでしょうか.これは、「楽観的なUI」と呼ばれる特性を開くためです.
クライアントが
Meteor.call
メソッドを甘やかすと、この時点で2つのことが起こります.サービス側から返された結果がクライアントシミュレーションの結果と一致する場合、すべては以前に示したようになります.サービス側から返された結果とクライアントシミュレーションの結果が一致しない場合、インタフェースはサービス側の実際の状態からの反応を補完します.
Meteorのいくつかの「方法定義」と「楽観的なUI」をマスターすると、サービス・エンド・コードのセキュリティ保護と伝送遅延なし(no round-trip delay)という2つの世界の真髄が得られます.blog post about optimistic UIを読むと、この方面の知識をもっと知ることができます.