私はいくつかの意見が必要です。
友人のために POS と在庫管理ソフトウェアを開発する予定です。これは 1 人の小規模プロジェクトなので、アーキテクチャをできるだけシンプルにしたいと考えています。
私は Winform を使用して GUI を開発しています (Web インターフェイスは POS ソフトウェアには意味がありません)。データベースには Postgresql を使用しています。
プログラムはユーザーの役割に基づいてアクセスを制御するため、Web サーバーを使用してユーザー アクセスを制御する中間層を開発するか、Postgresql で直接ユーザー権限を設定する必要があります。
中間層の開発には時間がかかり、メンテナンスはより複雑になります。そのため、データベースで直接アクセス制御を設定することを好みます。
データベースを使用してユーザー アクセスを制御するのは面倒なようです。ロールごとに特権を設定する必要があります。一部のテーブルでは、権限が列レベルであることは言うまでもありません。これにより、セキュリティに関する推論が非常に難しくなります。
だから私が今やっていることは、スーパーユーザー以外はすべてのテーブルにアクセスできないように設定することです. プログラムは public ロールを使用してデータベースに接続します。一般ユーザーはテーブルにアクセスできないため、SECURITY DEFINER (スーパーユーザー ロール) を使用して、一般ユーザーがアクセスできるストアド ファンクションを作成します。テーブルにアクセスする唯一の方法は、これらの関数を使用することです。
ユーザーの役割とパスワードを表にまとめます。スーパーユーザー以外は user テーブル自体にアクセスできないため、 login 関数を作成します。これを と呼びましょうfn_login(username, password)
。ログインが成功すると、fn_login はセッション キーを返します。
他の関数を呼び出すには、ユーザーにセッション キーを提供する必要がありfn_purchase_list(session_key)
ますfn_purchase_new(session_key, purchase_id, ...)
。
そのようにして、ストアド関数を API として扱っています。新しい Postgresql ロールを追加するのではなく、ユーザー テーブルに新しい行を追加するだけでよいため、新しいユーザーの追加はより簡単になります。列レベルで権限を設定する必要はありません。すべての制御はプログラムで行われます。
それで、あなたはどう思いますか?このアプローチは実現可能でスケーラブルですか? それを行うより良い方法はありますか?
ありがとう!