首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHIbernate与安全/业务层

NHIbernate与安全/业务层
EN

Stack Overflow用户
提问于 2009-03-31 14:20:03
回答 1查看 1.5K关注 0票数 2

我刚刚开始在一个个人项目中玩/学习NHibernate,觉得我没有“得到”什么东西。我习惯于让应用程序像这样工作:

表示层->业务层->持久化层。例如,我的表示层将调用BusinessLayer.GetCustomer(id)。在这种方法中,我将检查调用方是否有权获取客户。好吧,这对NHibernate来说还是很好的。不过,我的问题是,如何在更新、添加和删除上设置任何安全性?例如,假设我想修改返回的客户。通常情况下,我会这样做:

代码语言:javascript
复制
customer.FirstName ="Mike";
BusinessLayer.UpdateCustomer(customer);

同样,UpdateCustomer方法将检查您是否可以更新此客户。好的,但是对于NHibernate,为了更新客户,我只需要设置FirstName。然后,我不需要调用Update,因为它都是透明的。这就是Hibernate的要点:“透明和自动持久性”。那么,如何在透明的情况下进行安全检查呢?我只是不相信自己,不犯错误,做这样的事情:

代码语言:javascript
复制
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检查,这只会抛出一个异常,因为该用户无法更新其他用户的名称。

另一个问题。假设我是管理员,可以在系统中执行任何操作,并且我有如下代码:

代码语言:javascript
复制
//Display a customers orders that haven't shipped yet:
var Orders = Customer.Orders;
Orders.RemoveAll(order => order.HasNotShipped);
Grid.DataSource = Orders;
Grid.DataBind();

好的,这里我只想过滤订单,但是我无意中从数据库中删除了它们。透明度使我做了一件非常糟糕的事。如何减少这种风险?

我真的想使用NHibernate,但我不想用错误的方法。救命!:)

EN

回答 1

Stack Overflow用户

发布于 2009-03-31 16:36:52

关于您的安全问题,请查看NHibernate 保护者文件。拦截器允许您连接到会话生命周期,并将启用您正在寻找的功能。

第二个问题是为什么要创建存储库,并且只公开所需的功能。如果应用程序不需要RemoveAll函数(大多数不需要),那么就不要公开它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/701192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档