У нас есть таблица AccessControlEntry, которая выглядит следующим образом:
CREATE TABLE [dbo].[AccessControlEntry]
(
[subjectId] [nvarchar](256) NOT NULL,
[objectType] [varchar](256) NOT NULL,
[objectId] [int] NOT NULL,
[permission] [varchar](50) NOT NULL,
[flag] [int] NOT NULL DEFAULT (0),
[applyToChildren] [int] NOT NULL DEFAULT (1),
CONSTRAINT [PK_AccessControlEntry] PRIMARY KEY CLUSTERED ([subjectId] ASC, [objectType] ASC, [objectId] ASC, [permission] ASC)
)
Идентификатором пользователя, для которого мы устанавливаем права доступа, является subjectId, objectType и objectId идентифицируют объект, для которого мы устанавливаем права доступа (Ресурс в вашей терминологии). В нашем случае у нас есть отдельные записи для каждого разрешения (т. Е. Список, просмотр, создание, изменение, удаление), но вы также можете легко получить столбец для каждого разрешения.
Затем мы создали табличную функцию, которая принимает subjectId, objectType и, опционально, objectId и возвращает разрешения.
Как только вы это сделаете, вы получите эту табличную функцию, которая будет отображаться почти во всех ваших запросах, так что вы сможете отфильтровать то, что возвращается по разрешениям, которые пользователь имеет для ресурса.
Поскольку наши данные имеют иерархическую природу (вроде бизнес-единиц в компании), наша система разрешений обрабатывает иерархию разрешений и наследования. Я не знаком с вашей моделью данных, поэтому не имею представления о том, что у вас также есть требования для этого, но идея похожа на то, как вы применяете разрешения безопасности к каталогам и файлам.