NHIbernate и безопасность / бизнес-уровень - PullRequest
2 голосов
/ 31 марта 2009

Я только начинаю потренироваться / изучать NHibernate для личного проекта, и чувствую, что я чего-то не "получаю". Я привык, что приложения работают так:

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

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

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

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);  
}

К сожалению. Я просто уничтожил имена всех клиентов в базе данных. Это надумано? Да. Теперь, если бы у меня была какая-то проверка 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, но я не хочу сделать это неправильно. Помогите! :)

1 Ответ

0 голосов
/ 31 марта 2009

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

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

...