アクセス制御システムを作成しようとしています。
アクセスを制御しようとしているテーブルがどのように見えるかを簡略化した例を次に示します。
things table:
id group_id name
1 1 thing 1
2 1 thing 2
3 1 thing 3
4 1 thing 4
5 2 thing 5
アクセス制御テーブルは次のようになります。
access table:
user_id type object_id access
1 group 1 50
1 thing 1 10
1 thing 2 100
アクセスは、「モノ」の ID を直接指定して付与するか、グループ ID を指定してモノのグループ全体に付与することができます。上記の例では、ユーザー 1 にはグループ 1 へのアクセス レベル 50 が付与されています。これは、個々のものへのより具体的なアクセスを許可する他のルールがない限り適用されます。
特定のユーザーのアクセス レベルと共にリスト (ID のみで問題ありません) を返すクエリが必要です。したがって、上記の例を使用すると、ユーザー ID 1 に対して次のようなものが必要になります。
desired result:
thing_id access
1 10
2 100
3 50 (things 3 and 4 have no specific access rule,
4 50 so this '50' is from the group rule)
5 (thing 5 has no rules at all, so although I
still want it in the output, there's no access
level for it)
私が思いつくことができる最も近いものはこれです:
SELECT *
FROM things
LEFT JOIN access ON
user_id = 1
AND (
(access.type = 'group' AND access.object_id = things.group_id)
OR (access.type = 'thing' AND access.object_id = things.id)
)
しかし、「もの」テーブルの各行に1つだけが必要な場合、複数の行が返されます。「モノ」ごとに 1 行にまとめる方法や、「グループ」ルールよりも「モノ」ルールを優先する方法がわかりません。
参考になれば、私が使用しているデータベースは PostgreSQL です。
私が見逃した情報がありましたら、お気軽にコメントを残してください。
前もって感謝します!