次のデータベース構造を想定します(必要に応じて変更可能)...
ページと有効なアクセス許可を含む行を返すことができるように、特定のページで特定のユーザーの「有効なアクセス許可」を決定するための良い方法を探しています。
理想的なソリューションには、現在のユーザーの特定のページ行の「有効な権限」を評価するために必要な再帰を実行するためにCTEを使用する関数が含まれると考えています。
背景と実装の詳細
上記のスキーマは、コンテンツ管理システムの開始点を表しており、ロールにユーザーを追加したり、ロールからユーザーを削除したりすることで、ユーザーに権限を付与できます。
システム内のリソース(ページなど)はロールに関連付けられており、そのロールにリンクされたユーザーのグループに付与する権限を付与します。
すべてのロールを拒否し、ツリー内のルートレベルページをそのロールに追加して、ユーザーをそのロールに追加するだけで、ユーザーを簡単にロックダウンできるようにするという考え方です。
これにより、(たとえば)会社で働いている請負業者が長期間利用できない場合でも権限構造をそのままにしておくことができます。これにより、その1つのロールからユーザーを削除するだけで、元の権限を同じように付与することもできます。 。
アクセス許可は、これらのルールに従うことによってファイルシステムに適用される可能性がある一般的なACLタイプのルールに基づいています。
CRUD許可はヌル可能ビットにする必要があるため、使用可能な値はtrue、falseであり、以下の場合は定義されていません。
- false +何か= false
- true +未定義= true
- true + true = true
- 未定義+未定義=未定義
いずれかの権限がfalseの場合-> false そうでない場合はtrue-> true その他(すべて未定義)-> false
つまり、ロールメンバーシップを介して権限が付与され、拒否ルールが許可ルールをオーバーライドしない限り、何も許可されません。
これが適用される権限の「セット」は、現在のページまでのツリーに適用されるすべての権限です。つまり、このページのツリー内のページに適用されるロールにfalseがある場合、結果はfalseになります。ただし、ここまでのツリー全体が定義されていない場合、現在のページには真のルールが含まれ、結果はここでは真になりますが、親では偽になります。
可能な場合はdb構造を大まかに保持したいと思います。また、ここでの目標は次のようなことを実行できるようにすることです。select * from pages where effective permissions (read = true) and user = ?
したがって、どのようなソリューションでも、有効なアクセス許可を持つクエリ可能なセットを許可する必要があります。何らかの方法で(基準を指定できる限り、それらを返すのはオプションです)。
2つのページが存在し、1つが他の子であり、2つの役割が存在すると仮定します。1つは管理ユーザー用で、もう1つは読み取り専用ユーザー用であり、どちらもルートレベルのページにのみリンクされ、期待どおりの出力として次のように表示されます。
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False