这个问题的灵感来自this SO question about Access Control in ASP.NET MVC。在这里,我试图将公认的答案转化为切实的解决方案。
答案提到使用FileSystemSecurity
作为管理权限的灵感。在这里,我还使用带有 Flags 属性的枚举来为我的所有对象定义 ACL。此外,我的对象的每个成员都将存储在 SQL 中的一列中。假设一个简化的 Linq2SQL、EF 或 nHibernate ORM 映射。
编辑:为这种方法添加了以下好处/理由
这种安全模型的灵感来自FileSystemRights,这是一种管理文件级别权限的 .NET 方法。
我喜欢这种方法的主要原因之一是我可以通过将所有单独的 ACL 组合在一起来轻松创建所有权限的摘要。我也喜欢我可以添加一个拒绝 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的权限表。这应该减少对特定行的并发更新的需要。
问题
这是一个好主意吗?
以前有人做过(比这更好)吗?(编辑:这是这里接受的答案)
如果这是实现权限的标准方式,它叫什么?