web-dev-qa-db-ja.com

変更不可能なデータをデータベースとコードのどちらに保存するか

こんにちは、私はNodeJS ExpressJS搭載のAPIサーバーでロールベースの動的ルート認証システムを作成しようとしています。

シナリオ:

  • Admin、StandardUserなどのロールがいくつかあり、それらを編集または削除することはできません。

  • 承認されたユーザーが動的に追加のロールを追加できます。もちろん、これらの役割は編集または削除できます。

  • 許可されたユーザーは、すべてのルート許可を設定できます。ロールAはルートXを使用できるように設定できます。すべてのロールに対してそれを実行できます。動的ロール、またはAdminやStandardUserなどの「変更できない」ロール。

私のシナリオでは、動的ロールとルートアクセスをロールに動的に割り当てるためのRoutePermissionsテーブルのため、ロールテーブルが必要であることを示しています。しかし、「変更できない」データを保存する方法が見つかりません。

  1. 「変更不可」のロールはどこに置くべきですか(用語があるかどうかわかりません。知らせてください。)役割データ。 SuperAdminロールとStandardUserロールをどこに配置すればよいですか? DBの役割テーブルに配置すると、動的データテーブルに2つの変更不可能な行が含まれるためです。

  2. 「変更できない」ルートデータはどこに配置すればよいですか。ルート(POST/users/deactivate)はシステムでコード化されているので、データベースに配置することは正しくないと思います。私が思うに、データベースには動的データのみが含まれている必要がありますが、ルートは動的ではありません。

  3. 「変更できない」データをDBに配置しない場合。 enumやconstsなどのコードに保存できますが、それらを使用して動的にアクセス許可を作成するにはどうすればよいですか?権限は役割ごとに動的であるためです。 (AdminやStandardUserであっても、動的な役割ではないことに注意してください。)

2
Mansur

データが「変更不可」であっても、必ずしも変更できないことを意味するわけではありません。アプリケーションから変更することはできません。各行に「変更不可」フラグを設定します。 trueの場合、アプリケーションはデータの変更を拒否します。 falseの場合は変更できます。これをどのように実施するかは、あなたがどれだけ偏執的であるかに依存します。

これをアプリケーション層に制限する場合、データへのすべての変更はアプリ層を通過する必要があります。そうしないと、データベーステーブルに「変更不可能な」フラグがあっても、他の何かがまだデータを変更する可能性があります。ニーズによっては、これが望ましい場合があります。

この動作を強制するストアドプロシージャを作成できます。ストアドプロシージャを所有するユーザーを除くすべてのユーザーから、すべてのINSERT、UPDATE、およびDELETE特権を取り消します。これにより、すべてのデータ変更がストアドプロシージャを通過します。

コード内のデータとデータベース内のデータを混在させることは、不可能ではありませんが、テストの労力が増加します。 「コード内のデータ」は、どこでもテストする必要のあるロジックの分岐を示します。これは最初は負担にならないでしょうが、これは後でプロセスを引きずり始めるでしょう。

単純にする。データとして保管してください。インフラストラクチャのどのレイヤーでデータの不変性を強制するかを決定します(NodeJSのアプリ層またはデータベースのストアドプロシージャ)。

8
Greg Burghardt

後で変更されることのないデータをDBに保存することには、本質的に問題はありません。このデータをいじる簡単な方法がないことを確認してください。

  1. SuperAdminロールとStandardUserロールをどこに配置すればよいですか?

それらを役割テーブルに入れるだけですが、そのテーブルにブール値の「読み取り専用」列を導入します。したがって、アプリケーションによって変更されるべきではないレコードにマークを付けることができ、アプリケーションはそれに応じて動作できます。

誰も一貫性のない方法でそのデータを変更していないことを確認したい場合は、予想されるすべてのレコードが予想される内容でロールテーブルにあるかどうかを検証する健全性チェックを実装します。この健全性チェックを実行できる場所またはプロセスを見つけます(たとえば、サーバーの起動時、またはロールテーブルを編集するためのプロセスでこれが十分に頻繁でない場合)。

  1. 「変更できない」ルートデータはどこに配置すればよいですか?

そのルートデータがDBに必要かどうかはわかりませんが、「変更可能な」ルートデータもあり、これを「変更不可能な」データで一貫して管理する必要があるために必要な場合は、同じ戦略#1を適用できます:

  • 変更可能なデータと区別できるように、カスタムの「読み取り専用」フラグでデータをマークします

  • 誰もデータをいじっていないことと、DBに保存されているルートがコードにハードコーディングされているルートと一致していることを検証します。

  1. 「変更できない」データをDBに配置しない場合...

これを忘れてください。データをDBに保存するだけです。

5
Doc Brown