NHIbernate 和安全/业务层
Posted
技术标签:
【中文标题】NHIbernate 和安全/业务层【英文标题】:NHIbernate and Security / Business Layer 【发布时间】:2010-10-16 14:48:07 【问题描述】:我刚刚开始为个人项目玩弄/学习 NHibernate,感觉我没有“得到”一些东西。我习惯让应用程序这样工作:
表示层 --> 业务层 --> 持久层。例如,我的表示层将调用 BusinessLayer.GetCustomer(id)。在该方法中,我将检查调用者是否有权获取客户。好的,这仍然适用于 NHibernate。不过,我的问题是我如何对更新、添加和删除有任何安全性?例如,假设我想修改我得到的客户。通常,我会这样做:
customer.FirstName ="Mike";
BusinessLayer.UpdateCustomer(customer);
同样,UpdateCustomer 方法会检查您是否可以更新此客户。好的,但是使用 NHibernate,要更新客户,我只需设置 FirstName。然后我不需要调用更新,因为它都是透明的。这就是 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】:对于您的安全问题,请查看 NHibernate Inteceptor documentation。拦截器可让您进入会话生命周期,并启用您正在寻找的功能。
第二个问题是为什么您创建存储库并只公开您需要的功能。如果应用程序不需要 RemoveAll 函数(而且大多数不需要),则不要公开它。
【讨论】:
我见过拦截器的东西。我想我很好奇这是否是其他开发人员正在使用的。至于removeall,也许我误解了你。在我的示例中,Orders 只是返回一个 IList。如果您从该 IList 中删除内容,它们是否不会从数据库中删除? 这取决于您如何管理会话。如果您的存储库层返回所有记录,然后关闭会话,则从列表中删除对数据库没有任何影响。然后,您的存储库将提供删除数据的方法。以上是关于NHIbernate 和安全/业务层的主要内容,如果未能解决你的问题,请参考以下文章
使用 NHibernate 和上下文更改数据库设计分层应用程序