私は長年のプログラマーですが、データベースの設計はほとんど行ったことがありません。そのため、開発中のソリューションに関するフィードバックを求めています。
説明
リモートサーバーに機密データを保存している数人 (10 人から 20 人) の顧客がいます。顧客は、ユーザーを持つ組織です。アクセスは、MySQL サーバーにアクセスするサーバー上で実行されている Java ソフトウェアを介して行われます。別のクライアント Java プログラムがサーバーにアクセスし、交換を行います。
データのプライバシーは非常に重要であるため、顧客ごとに個別の DB (スキーマ) を計画しています。各データベース内には、input、query、および admin の 3 つのユーザー レベルがあります。ユーザーはこれらのレベルのいずれかに該当し、DB に対するさまざまな権限を取得します。私はストアド プロシージャを使用してすべてを行うことを計画しているので、実際には特定の DB の一連のストアド プロシージャにアクセスしています。
最大の課題は、顧客の管理者ユーザーが、顧客のデータベースにのみアクセスできるユーザーを追加 (または削除) できる必要があることです。ユーザーは DB に対して一意である必要がありますが、MySQL インスタンスに対しては一意ではありません。たとえば、各顧客には「bob」という名前のユーザーがいるはずです。
質問
したがって、現在、これにアプローチする方法は2つあります。私が現在好んでいるのは、各ユーザーを、付与された権限を持つことができる実際の MySQL ユーザーにすることです。これにより、ロールが MySQL レベルで正しく指定したものだけを実行できるようになります。問題は、MySQL ユーザー名がすべての DB に対してグローバルであるため、名前の衝突です。ユーザーのcustomerID(各ユーザーではなく各顧客に固有)をDBにマップする「ルート」テーブルを作成し、そのDBのテーブルがユーザーの名前をユーザーIDにマップすることで解決しました。これが実際のMySQLユーザーです. Java サーバー ソフトウェアは、マップされたユーザー ID とユーザーのパスワードを使用して DB に接続し、処理を開始します。これを行うにはかなりの労力とフープジャンプが必要ですが、セキュリティの観点からは気に入っています。
もう 1 つの方法は、Java ソフトウェアが接続する DB に数人のベース ユーザーを配置し、各顧客の DB にユーザー名とパスワードを保存して独自の認証を作成することです。MySQL ではそれを防ぐことはできないため、適切な DB のみが変更され、適切な関数のみが呼び出されることなどを確認するのはソフトウェア次第です。基本ユーザーは、すべてのユーザー タイプに対してすべての権限を持っている必要があるため、Java ソフトウェアのソフトウェアの不具合や侵害が DB に悪影響を与える可能性があります。DB は簡単になりますが、ソフトウェアはやや複雑になります。
フィードバック
では、DB のベテランからこれについてフィードバックはありますか? このような問題をより良い方法で解決した人はいますか? 何かにコミットする前に、いくつかのアイデアを得ようとします。
ありがとう、マット