Этот вопрос вызван этим вопросом 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;}
/ Конец редактирования
Затем мне пришло в голову, что я могу сравнить менее привилегированных пользователей по числовому значению 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,
}
У меня есть таблица разрешений, которая объединяет идентификатор пользователя с ACE для конкретного объекта. Это должно снизить потребность в одновременных обновлениях определенной строки.
Вопрос
Это хорошая идея?
Кто-то делал это раньше (лучше, чем это)? (Изменить: Это принятый ответ здесь)
Если это стандартный способ реализации разрешений, как он называется?