Allow and Deny

コラム 8.5

翻訳の進捗

本章で学ぶこと:

  • AllowとDenyのコールバックを学習する
  • コールバックが呼び出される順序の理解
  • Meteorのセキュリティシステムは、変更したい場合にメソッドに変更を行う必要なく、 データベースの変更を制御することができます。

    私たちは余分なプロパティを持つ投稿を装飾してその投稿のURLがすでに投稿されていたとき、特別な行動をとるような補助作業を行うために、 記事を作成する際に特別なpostメソッドを作成する必要がありました。

    一方で、記事の更新や削除するための新しいメソッドを作成する必要はありませんでした。 ユーザーがこれらのアクションを実行する権限を持っていたかどうかを確認するために必要な、allowdenyコールバックで簡単にできました。

    これらのコールバックを使用すると、私たちはデータベースの変更の詳細については宣言型であること、 および幾つかの種類の更新の使用することで、できると言うことができます。 アカウントシステムと統合するという事実はおまけです。

    複数のコールバック

    必要に応じて、我々は多くのallowコールバックを定義することができます。

    我々はただ与えられた変更のためにtrueを返すためにそれらの少なくとも一つを必要としています。

    それで、Posts.insertがブラウザから呼び出されることで(クライアントサイドのコードかコンソールからのものかは関係なく)、 サーバーはtrueを返すものが一つでもあればinsertは許可と判断します。 それがいずれも見つからない場合は、挿入を許可しませんし、クライアントに403エラーを返します。

    同様に、一つ以上のdenyコールバックを定義することができます。これらのコールバックのいずれかがtrueを返した場合は、変更がキャンセルされ、403が返されます。 このロジックの意味することは、insertが成功するには一つ以上のallow insertコールバックとすべてのdenyinsertコールバックが実行されることを意味します。

    Note: n/e stands for Not Executed
    Note: n/e stands for Not Executed

    言い換えれば、Meteorは最初のdenyで始まるコールバックリストを下に移動させ、 その後allowの1つがtrueを返すまで、すべてのコールバックを実行します。

    このパターンの実用的な例は、2つのallow()コールバックを持つ可能性があり、 ポストは、1つめで現在のユーザーに属しているかどうかをチェック、もう一つで現在のユーザーが管理者権限を持つかどうかをチェックします。 現在のユーザーが管理者である場合は、それらのコールバックの少なくとも一つがtrueを返しますので、これは、彼らがどんな記事を更新することができるかが保証されます。

    レイテンシー補正

    .update()など)データベース変異メソッドは他のメソッドと同様に、待ち時間補償されることを忘れないでください。 だから、例えば、あなたがブラウザのコンソールから、あなたに属していない投稿を削除しようとすると、 ローカルのコレクションは、投稿が簡単に消えて表示されますが、サーバーがそのことを通知されてから実際の削除が行われるため、実際にはその瞬間に文書は削除されていません。

    もちろん、この動作は、コンソールから発生する問題はありません。 (ユーザーがコンソール上でデータを台無しにしようとした場合、彼らのブラウザで何かが起りますが、こちら側に影響はしません) ただし、これはあなたのユーザーインターフェイスに起こらないことを確認する必要があります。 たとえば、削除は許可していない文書のための削除ボタンを表示していないことを確認するために労力を割く必要があります。

    ありがたいことに、あなたはクライアントとサーバの間の権限コードを共有することができますので、 (たとえば、ライブラリ関数canDeletePost(user, post)を書くことができ、/libディレクトリにそれを置き共有します。) したがって余分なコードを必要としません。

    サーバー側のアクセス権

    許可システムはクライアントから開始されデータベース変異に適用されることを覚えておいてください。 サーバーでは、Meteorは、すべての操作が許可されていることを前提としています。

    このことは、サーバー側でdeletePostMeteorメソッドを記述した場合、あなたがクライアントから呼び出すことができ、 誰もがどんな投稿を削除することができることを意味します。 そのメソッド内のユーザー権限をチェックしない限り、実行は避けたいと思うはずです。