2009-03-31 2 views
2

Я только начинаю поиграть с NHIBernate/изучать NHibernate для личного проекта и чувствовать, что я не «что-то» получаю. Я привык к тому, что приложения работают следующим образом:NHIbernate и Security/Business Layer

Уровень презентации -> Бизнес-уровень -> Стойкость. Так, например, мой уровень представления вызовет BusinessLayer.GetCustomer (id). В этом методе я бы удостоверился, что вызывающий абонент имеет право на получение клиента. Хорошо, что все еще отлично работает с NHibernate. Мой вопрос заключается в том, как я могу получить защиту от обновлений, добавления и удаления? Например, предположим, что я хочу изменить клиента, которого я получил. Обычно я бы сделал это:

customer.FirstName ="Mike"; 
BusinessLayer.UpdateCustomer(customer); 

Опять же, метод UpdateCustomer проверит, что вы можете обновить этого клиента. Хорошо, но с NHibernate, чтобы обновить клиента, я просто собираюсь установить FirstName. Затем мне НЕ НУЖНО называть Update, поскольку он прозрачен. Вот в чем смысл права на спячку: «Прозрачное и автоматическое сохранение». Итак, как я могу проверить свою безопасность с этой прозрачностью? Я просто недостаточно доверяю, чтобы не ошибиться и не сделал что-то вроде:

List<string> customerNames = new List<string>(); 
foreach (Customer c in GetCustomersThatLikeStuffThatILike()) { 
    string custName=""; 
    c.CustomerName = custname; //Oops. I meant to say: custname = c.CustomerName; 
    customerNames.Add(custName); 
} 

Oops. Я просто уничтожил все имена клиентов в базе данных. Это надуманное? Да. Теперь, если бы у меня была какая-то проверка BusinessLayer, это просто выбросило бы исключение, потому что этот пользователь не может обновлять имена других пользователей.

Другая проблема. Предположим, я администратор и может действительно сделать что-либо в системе, и у меня есть такой код:

//Display a customers orders that haven't shipped yet: 
var Orders = Customer.Orders; 
Orders.RemoveAll(order => order.HasNotShipped); 
Grid.DataSource = Orders; 
Grid.DataBind(); 

ОК, так что здесь я просто хотел, чтобы фильтровать заказы, но я случайно в конечном итоге их удаление из базы данных , Прозрачность заставила меня сделать что-то очень плохое. Как смягчить этот риск?

Я действительно хочу использовать NHibernate, но я не хотите сделать это неправильный путь. Помогите! :)

ответ

0

Для вашего вопроса безопасности ознакомьтесь с NHibernate Inteceptor documentation. Перехватчики позволяют подключиться к жизненному циклу сеанса и активировать функциональность, которую вы ищете.

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

+0

Я видел материал перехватчика. Наверное, мне было любопытно, если это то, что используют другие разработчики. Что же касается removeall, возможно, я не понимаю вас. В моем примере Orders просто возвращается IList. Если вы удаляете вещи из этого IList, они не удаляются из базы данных? – aquinas

+0

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