この質問は、ASP.NET MVC のアクセス制御に関するこの SO の質問に触発されています。ここでは、受け入れられた答えを具体的な解決策にしようとしています。
答えはFileSystemSecurity
、アクセス許可を管理するためのインスピレーションとしての使用について言及しています。ここでは、Flags 属性を持つ列挙型も使用して、すべてのオブジェクトの ACL を定義しています。さらに、オブジェクトの各メンバーは SQL 内の列に格納されます。単純化された Linq2SQL、EF、または nHibernate ORM マッピングを想定します。
編集:このアプローチに次の利点/根拠を追加しました
このセキュリティ モデルは、ファイル レベルのアクセス許可を管理する .NET アプローチであるFileSystemRightsに触発されました。
私がこのアプローチを気に入っている主な理由の 1 つは、すべての個々の ACL を OR で結合することにより、すべてのアクセス許可の概要を簡単に作成できることです。また、継承されたアクセス許可を削除するために DENY ACL を追加できることも気に入っています。
List<myObject> PermissionsList = GetACLForObject(ItemID, UserID);
foreach (var acl in PermissionsList)
{
// The following enum has the [FlagsAttribute] applied so the .ToString() is pretty
PermissionWithFlagsEnum sampleForSO = (PermissionWithFlagsEnum )acl.Permission;
Console.Writeline ("Setting " + sampleForSO.ToString() + " permission for group: " + acl.ACLName);
ResultingPermission = resultPermission | acl.Permission ;
}
public int ResultingPermission {get;set;}
/編集終了
enum
次に、権限の低いユーザーと権限の高いユーザーの の数値を比較できることに気付きましたenum
。
この定義により、バックエンドで列挙型を解析する必要なく、SQL データベース内のユーザーをすばやく簡単に識別できるようになると考えています。( で権限のないユーザーを見つけますselect users from permissions where security < DBAceessRights.DetailRead
)
フラグを定義した方法は次のとおりです(最小値には最小の権限があります)
[Flags]
public enum DBAccessRights
{
DenyAll =1 << 1,
WikiMode = 1 << 4,
AppearInListing = 1 << 8,
DetailRead = 1 << 12,
CreateNew = 1 << 18,
DetailEdit = 1 << 22,
DeleteChild = 1 << 26,
DeleteThis = 1 << 30,
EditPermissions = 1 << 31,
}
ユーザー ID をオブジェクト固有の ACE に結合する権限テーブルがあります。これにより、特定の行での同時更新の必要性が減少します。
質問
これは良い考えですか?
誰かが以前にそれをやったことがありますか (これよりも優れています)? (編集:ここで受け入れられた回答です)
これがアクセス許可を実装する標準的な方法である場合、それは何と呼ばれますか?