私がこれらの種類の要件を持っているとしましょう:
ロールAAのユーザーAは、タイプA1のすべてのエンティティを更新できる必要があります。
ロールBBのユーザーBは、プライマリ識別子が「2」のタイプA1のエンティティのみを更新できる必要があります。これをA1( "2")と呼びますが、タイプA1の他のエンティティは更新できません。タイプB2の子エンティティをエンティティA1( "2")にいくつでも追加または削除できます。
ロールCCのユーザーCは、エンティティA1( "2")に属するこれらの子B2エンティティのすべてではなくほとんどのプロパティを編集できる必要があります。また、ロールCCのメンバーはA1( "2")からB2エンティティを追加または削除できません。 )。
ユーザーDはロールBBとロールCCに属しており、メンバーシップが組み合わされた結果、2セットの権限の結合から派生した権限があります(この場合、ロールCCの権限はロールBBの適切なサブセットであるため、これはこれは、ユーザーDがロールBBで許可されているすべてのことを実行できることを意味します)。
等々。これらのポリシーは展開後に変更される可能性があるため、変更を実装するために大規模な再開発作業を必要としないでください(この問題を解決するための宣言型アプローチに必要な場合など)。
アクセス制御リスト(ACL)は、保護対象のオブジェクトと一緒に、またはオブジェクトの内部に格納されると思います。
コードを作成する開発者は、現在のプリンシパル、検討中のオブジェクト、検討中の操作を識別する引数を使用して、単一のメソッド/関数/操作/プロシージャを強制的に(宣言的にではなく)クエリできる必要があると思います(おそらくこれを呼び出します)特権)、操作を許可するか拒否するかを示す単一のブール値を取得します。
私の仮定に自由に挑戦してください。
今、私はすでにシンプルでありながら効果的な独自の一般的なソリューションを念頭に置いています(私がすでに本番環境にコミットし、非常にうまく機能している作業に基づいています)。これをオープンソースプロジェクトとして公開することを検討しています。
しかし、それを次のレベルに引き上げてこのビースティーを構築する前に、開発者がこの種の実装をすでに支援している、広く受け入れられているシステム、モジュール、またはライブラリ(必ずしも.NETである必要はありません)を知っている人はいないかと思いました。エンティティのきめ細かい制御(データベースレコードまたはORM内のオブジェクトなどを意味するかどうか)。
PWこれをSOに投稿する前に回答を確認したところ、Zend_AclがLAMPプロジェクトに対してこの種の機能を備えている可能性があることを示唆する回答(SO LINK)を他の場所で見つけましたが、代わりに.NET/Windowsソリューションを使用したいと思います。