Как обрабатывать авторизацию с помощью Breeze JS?

В настоящее время мое приложение просматривает параметры маршрутизатора и вошел в систему как пользователь (Principal.Identity), чтобы разрешить доступ к определенным ресурсам (например, добавить учащегося в свой класс [identity + class id]). Однако, если я не ошибаюсь, breeze js поддерживает только одно массовое сохранение. Похоже, мне придется открывать все данные и проходить проверку / авторизацию. Это хорошо,

но то, что я могу потерять, это хорошее разделение сквозных задач вне моей бизнес-логики (как обработчик сообщений) (поиск ролей, которые пользователь играет в классе) и приятная функция аннотации Authroize (просто скажите, какие роли необходимы). Так нужно ли мне идти на компромисс или есть лучшая модель программирования, которую Breeze JS может предложить?

Обновление: Мой вопрос больше о том, как отделить логику авторизации (найти назначенные роли в обработчике сообщений + проверить, присутствуют ли требуемые роли, добавив атрибут авторизации в методы контроллера) от логики доступа к бизнесу или данным. Без бриза, я проверю входящее сообщение и его параметр маршрута, чтобы выбрать все его роли, а затем в моих методах put / post / delete я бы пометил необходимые роли. Я не могу использовать эту технику с бризом (это не ограничение бриза, его компромисс, когда вы идете для массового сохранения). Поэтому я хотел бы знать, есть ли какая-либо модель программирования или шаблон дизайна, уже используемые бризом. В примерах breeze есть что-то, что переопределяет контекст и использует шаблон репозитория, пока последует этому.

3 ответа

Решение

Breeze может иметь столько конечных точек "сохранения", сколько вы хотите. Например, гипотетическая реализация сервера может быть

[BreezeController]
public class MyController : ApiController {

  [HttpPost]
  [Authorize(...)]
  public SaveResult SaveCustomersAndOrders(JObject saveBundle) {
    // CheckCustomersAndOrders would be a custom method that validates your data 
    ContextProvider.BeforeSaveEntitiesDelegate = CheckCustomerAndOrders;
    return ContextProvider.SaveChanges(saveBundle);
  }

  [HttpPost]
  [Authorize]
  public SaveResult SaveSuppliersAndProducts(JObject saveBundle) {
     ...
  }

Вы бы назвали эти конечные точки, как это

var so = new SaveOptions({ resourceName: "SaveWithFreight2", тег: "обновление фрахта" });

   myEntityManager.saveChanges(customerAndOrderEntities, { 
     resourceName: "SaveCustomersAndOrder" }
   ).then(...)

или же

   myEntityManager.saveChanges(supplierAndProductEntities, { 
     resourceName: "SaveSuppliersAndProducts" }
   ).then(...)

Авторизация осуществляется через атрибут [Authorize] для каждого из методов [HttpPost]. Подробнее об атрибуте [Authorize] можно прочитать здесь: http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

Правильный способ сделать это IMHO - разделить авторизацию конечной точки и авторизацию действий базы данных.

Сначала создайте сущность, которая управляет грандами для каждого контроллера / метода и роли. Для каждого метода у вас есть допустимое значение - не разрешено для конкретной роли. Вы создаете специальный атрибут (подкласс Authorize), который вы применяете к своим контроллерам (breeze или обычный веб-интерфейс API), который считывает данные и решает, можно ли вызвать конкретную конечную точку для пользователя / роли. В противном случае он генерирует Несанкционированное исключение.

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

var origAjaxCtor = breeze.config.getAdapterInstance ('ajax');

$.extend (true, origAjaxCtor.defaultSettings, Security.getAuthenticationHeaders ());

На сервере добавьте вторую сущность, которая управляет авторизацией для операций CRUD. Вам нужна таблица типа (EntityName, AllowInsert, AllowUpdate, AllowDelete). Добавьте событие BeforeSave в диспетчере контекста или в ORM (EF или что-то еще), которое зацикливает все сущности и применяет политику, указанную в таблице выше. Таким образом, у вас есть четкое отделение логики конечной точки от логики CRUD бэкэнда.

Во всех случаях логика авторизации должна быть сначала реализована на стороне сервера, а при необходимости должна быть передана клиентам.

Способ реализации breeze и вышеупомянутая конструкция не требуют более 1 конечной точки сохранения.

Надеюсь, поможет.

Однако, если я не ошибаюсь, breeze js поддерживает только одно массовое сохранение.

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

Другие вопросы по тегам