Как обрабатывать авторизацию с помощью 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 поддерживает только одно массовое сохранение.
Это совершенно неправильно. Вы можете свободно создавать свои собственные методы сохранения. Прочитайте документы, это все там.