2014-10-03 12 views
0

У меня есть приложение MVC.Net, которое разделяется на ярусы, содержащие репозитории, бизнес-логику и интерфейсные службы для контроллеров AngularJS и MVC.Передача идентификатора пользователя с помощью приложения n-уровня

Репозитории в настоящее время автономны и не обернуты в единицу рабочего шаблона. Этот рефакторинг будет проходить.

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

В настоящее время у меня есть класс UserLogic, который поддерживает ссылку на текущий зарегистрированный пользовательский Entity. Этот класс UserLogic затем вводится в контроллеры/бизнес-логику и т. Д. Но я подозреваю, что это довольно запутанный механизм для использования!

+0

Каким образом пользовательский контекст будет использоваться для «безопасности»? Например, я работал над приложением один раз, когда любая вставка/обновление базы данных должна была быть помечена идентификатором пользователя, который выполнил его, и удобным способом сделать это было требование объекта контекста пользователя при создании экземпляра единицы рабочего объекта. – David

+0

В приложении есть несколько пользователей, каждый из которых владеет различными другими объектами. Я хочу, чтобы пользователь A не мог получить доступ/изменить учетную запись пользователя B. Я хочу сделать это в Repo, чтобы удалить необходимость в проверке этого в контроллерах/бизнес-логике несколько раз. –

+0

Если репозиторий можно использовать вне единицы работы (что, очевидно, может быть до планируемого рефакторинга, конечно), то, возможно, тот же шаблон может применяться в более широком смысле, требуя объекта контекста пользователя при построении любого заданного репозиторий. Затем операции репозитория могут внутренне включать предложения WHERE в данные этого объекта прозрачно для остальной части кода. – David

ответ

1

Один из подходов может заключаться в том, чтобы любой конкретный репозиторий требовал контекста пользователя при создании экземпляра. Что-то вроде этого:

public class WidgetRepository 
{ 
    private UserContext User { get; set; } 

    public WidgetRepository(UserContext user) 
    { 
     if (user == null) 
      throw new ArgumentNullException("user"); 
     // maybe also confirm that it's a *valid* user in some way? 
     User = user; 
    } 

    // repository operations 
} 

Вы можете использовать столько «защитное программирование» в этом конструкторе, как вам нравится, я полагаю. Затем в операциях репозитория вы можете фильтровать запросы на основе этого пользователя. Что-то вроде:

public IEnumerable<Widget> Widgets 
{ 
    get 
    { 
     return dbContext.Widgets.Where(w => w.Owner.Id == User.Id); 
    } 
} 

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

Имейте в виду, что существуют компромиссы с такими вещами. Выполнение этого может работать очень хорошо в некоторых сценариях, а не в других. Если DAL прозрачно фильтрует данные на основе пользовательского контекста, может оказаться довольно сложно выполнить системные (не пользовательские) операции или административные (суперпользовательские) операции с тем же DAL. Невозможно сказать, будет ли это проблемой с моим текущим знанием вашей системы, это всего лишь хедз-ап по вопросам, которые я видел в прошлом.

+0

Для административной функциональности будут доступны отдельные нерезервные репозитории. Это в основном часть подхода ремней и брекетов. В своем предыдущем опыте, когда вы подключили пользователя к вашему UoW. Я хочу убедиться, что контроллеры остаются поддающимися проверке и не имеют доверия к HttpContext или похожим на получение текущего пользователя. –

+0

@BenFord: Когда мои репозитории отключаются от единицы рабочего объекта, я использую тот же шаблон в своем ответе, но только на этом объекте, а не на каждом объекте репозитория. (Так как в этом дизайне репозиторий не может быть создан, не будучи частью единицы рабочего объекта.) Нельзя полагаться на HttpContext, если вы его не создадите. Мои объекты «пользовательский контекст» являются обычными (даже если они просто обертки для чего-то основанного на каркасе), поэтому их можно издеваться. В противном случае, даже помимо тестирования, наличие ссылки на статический тип для веб-объекта в DAL означало добавление ссылок на сборку, которые я там не хотел. – David