Безопасность на уровне записей в LINQ-to-SQL - PullRequest
2 голосов
/ 30 июня 2010

Я работаю над системой безопасности на уровне записей для приложения LINQ-to-SQL. В настоящее время у меня есть оболочка вокруг метода GetTable объекта DataContext, который соединяет T с таблицей перекрестных ссылок пользователя. T - это любой класс, который реализует мой интерфейс ISecurable:

public interface ISecurable
{
    bool CanRead { get; set; }
    bool CanUpdate { get; set; }
    bool CanDelete { get; set; }
}

Мой базовый класс репозитория выполняет объединение и обновляет свойства CanRead, CanUpdate и CanDelete для каждой истории для указанного пользователя:

var storiesVisibleToUser = repository.Get<Story>( user );

Я бы хотел заменить упаковщик методом расширения, чтобы я мог сделать что-то вроде этого:

var storiesVisibleToUser = repository.Get<Story>().ApplySecurity( user );

Это тонкое изменение, но оно значительно уменьшит связь между кодом безопасности и общим кодом доступа к данным, так что это даст мне больше гибкости для добавления таких вещей, как безопасность на уровне группы.

Проблема в том, что метод расширения ApplySecurity не имеет доступа к исходному DataContext, поэтому он не может использовать GetTable <> для получения записей перекрестных ссылок.

Два вопроса:

  1. Есть ли способ получить DataContext IQueryable, за исключением его подкласса / переноса и передачи контекста в конструктор ?

  2. Является ли метод расширения «правильным» способом сделать это, или я должен придерживаться метода в моем хранилище, который будет иметь доступ к исходному контексту?

1 Ответ

0 голосов
/ 30 июня 2010

Одним из возможных решений является создание связи между историей и таблицей перекрестных ссылок.Это затем делает другую таблицу доступной для запросов Story без ссылки на исходный контекст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...