0

私のアプリケーションでは、リクエスターは特定の列のみを照会する権限を持っています。列はリクエスタによって異なる場合があります。クエリごとに返される行が変わるように、where 句はリクエスト間で変わります。このアクセス制御を処理する最良の方法は何ですか? 配列を使用して許可された列を格納し、アプリケーションでチェックを行う必要がありますか?

私はPostgreSQL 9.xを使用しています

例: 患者の記録にアクセスできる医療専門家がいますが、すべての医療専門家がすべての情報にアクセスできるわけではありません。彼らは任意の患者 (uid を持つ) に関する恣意的な情報を要求しようとしますが、アクセス制御を実施する必要があります。

情報は名前、生年月日、血液型、病気だと言う

医師 A はすべてのフィールドの権限を持っています 医師 B は血液型以外のすべてを表示できます 管理者は名前と生年月日のみを表示できます 血液専門医は血液型のみを表示できます

4

2 に答える 2

1

オプション 2 を実装するには、次のような列権限テーブルを作成します。

CREATE TABLE ColumnPerms
(
    user_or_role      Varchar(50),
    table_name        Varchar(50),
    column_name       Varchar(50),
)

CREATE INDEX ix_Columnperms(user_or_role, table_name)

*table_name* 列は、この機能をアプリ内の複数のテーブルに実装できるようにするためのものです。不要な場合は使用しないでください。ユーザー名と衝突しないように、ロール名は「@」文字で始まるという規則を採用できます。

これで、動的クエリを作成するときに、次のようなことができます

SELECT column_name 
  FROM ColumnPerms 
 WHERE user_or_role = '@manager'
   AND table = 'Payroll'
   AND column_name IN ('first_name', 'last_name', 'hire_date', 'base_salary', 'bonus')

(IN 句には、返される可能性のある EVERY 列を含める必要があります)。

このクエリの結果は、ユーザーが表示できる列名のリストです。動的 SQL を構築するときに、それを反復して列リストを構築するだけです。

于 2013-07-10T01:57:57.673 に答える
0

次の 2 つの方法があります。

  1. Postgres を使用して、各ユーザー (またはユーザー ロール) の列レベルのアクセス許可を使用してセキュリティを強化します。ここで GRANT の構文を見てください: http://www.postgresql.org/docs/current/static/sql-grant.html

  2. ユーザーごとに返される行を制限する動的 SQL ステートメントを作成します。多くのユーザーがいる場合、または多くの異なる列の組み合わせがある場合、これはかなり面倒になる可能性があります。おそらく、クエリステートメントを作成するために、ユーザー ID のテーブルと「選択可能な」テーブル、列名を保持する必要があります。これを多くの異なるクエリに一般化する場合は、列のフィルタリングを行うテーブルを返す関数の上にそれらを構築するか、オプション 1 に戻すことができます。

オプション 1 では、結合で使用される列が選択可能であることを確認してください...

于 2013-07-10T01:24:52.567 に答える