Этот вопрос вдохновлен этим SO вопросом, касающимся контроля доступа в ASP.NET MVC.Здесь я пытаюсь привести принятый ответ в реальное решение.
В ответе упоминается использование FileSystemSecurity
в качестве источника вдохновения для управления разрешениями.Здесь я также использую перечисление с атрибутом Flags, чтобы определить ACL для всех моих объектов.Кроме того, каждый член моих объектов будет храниться в столбце в SQL.Предположим, что упрощенное сопоставление ORM для Linq2SQL, EF или nHibernate.
Редактировать: Добавлено следующее преимущество / обоснование для этого подхода
Эта модель безопасности была основана на FileSystemRights , подход .NET для управления разрешениями на уровне файлов.
Одна из основных причин, по которой мне нравится этот подход, заключается в том, что я могу легко создать сводку всех разрешений, ИЛИ объединяя все отдельные ACL.Мне также нравится, что я могу добавить 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;}
/ End Edit
Затем мне пришло в голову, что я могу сравнить меньшепривилегированных пользователей по числовому значению enum
из более привилегированных пользователей enum
.
Я думаю, что это определение позволит быстро и легко идентифицировать пользователей в базе данных SQL, не анализируяenum на бэкэнде.(Найти непривилегированных пользователей через 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,
}
У меня есть таблица разрешений который соединяет идентификатор пользователя с объектом ACE.Это должно уменьшить необходимость одновременных обновлений в определенной строке.
Вопрос
Это хорошая идея?
Кто-то сделал это?раньше (лучше чем это)?(Изменить: Это принятый ответ здесь )
Если это стандартный способ реализации разрешений, как он называется?