NHIbernate和安全/业务层

时间:2009-03-31 14:20:04

标签: security nhibernate business-logic-layer

我刚刚开始玩/学习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 个答案:

答案 0 :(得分:0)

关于安全问题,请查看NHibernate Inteceptor documentation。拦截器让您可以进入会话生命周期,并启用您正在寻找的功能。

第二个问题是您创建存储库并仅公开所需功能的原因。如果应用程序不需要RemoveAll函数(大多数不需要),则不要公开它。

相关问题