Многие из моих приложений работодателей имеют похожую внутреннюю структуру разрешений для ограничения данных для определенного набора пользователей или групп. Группы также могут быть вложенными.
Проблема, с которой мы сейчас сталкиваемся при таком подходе, состоит в том, что перечисление разрешений невероятно медленно. Текущий метод использует хранимую процедуру со многими курсорами и временными таблицами. Это хорошо работает для небольших приложений, но теперь у нас есть одна конкретная система, которая быстро развивается и начинает замедляться.
Основная структура таблицы выглядит следующим образом:
tblUser {ИД пользователя, имя пользователя, WindowsLogonName}
tblGroup {GroupID, Имя, Описание, SystemFlag}
tblGroupGroup {GroupGroupID, Имя,}
tblGroupUser {GroupUserID, Name,}
и связать все это вместе;
tblPermission {PermissionID, SecurityObjectID, SecuredID, TableName, AllowFlag}
который содержит строки типа ..
'5255-5152-1234-5678', '{ID группы}', '{ID для чего-то в tblJob}', 'tblJob', 1
'4240-7678-5435-8774', '{ID пользователя}', '{ID для чего-то в tblJob}', 'tblJob', 1
'5434-2424-5244-5678', '{ID группы}', '{ID чего-либо в tblTask}', 'tblTask', 0
Конечно, должен быть более эффективный подход для перечисления всех групп и получения идентификаторов защищенных строк?
Чтобы усложнить вещи дальше; если пользователю явно отказано в доступе к строке, это отменяет любые групповые разрешения. Это все в MSSQL.