- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我认为这更像是一个关于最佳实践和设计的问题,而不是其他任何问题。我尝试搜索与此相关的类似查询,但没有找到。我实际上找到了 Row Level Security with Entity Framework但我相信这里的上下文有点不同。
我将首先尝试解释我的场景:
我有一个 .net 3.5 网站,它使用通用的业务库通过 NHibernate 访问我的 SQL 2008 数据库。所有代码都是 C#,带有 NHibernate 2.1。我的网站显示来自业务库的不同 IList 的负载,业务层通过 NHibernate 从 SQL 获取所有数据。所以,例如,我可以有一个返回 IList 的方法,另一个返回 IList 的方法,另一个 IList,等等……关键是事件用户只能访问所有返回的一部分(几乎所有类型的结果集都必须从安全性中过滤),所以我需要在库上实现一个“数据过滤器”,它只返回允许的数据行到网站。为了实现这一点,图书馆使用了我网站上的 IPrincipal,这样我就可以获得用户详细信息来过滤数据,但是由于我们的安全模型非常复杂,因此将其散布到我们所有的方法中会产生巨大的维护问题。因此,为了解决这个问题,我们创建了几个 SQL SP,它们返回当前用户允许的项目,在业务逻辑上,我们只需要将请求的数据与安全数据结合起来,我们就有了要发送给用户的最终结果集。现在这个加入数据的过程正在使用 Linq to Objects,我在其中加入一个带有列表(安全)的 iList 以仅返回允许的结果集。IList 它以不同的方式来自 NHibernate,可以是 GetAll() 方法、ICriteria.List() 或 IQuery.List() 甚至是 NamedQuery.List(),并且安全数据总是来自其中之一两个 NamedQuery.List()。我还计划实现线程以允许同时进行 SQL 调用,并在 thread.join() 之后在两个 IList 上执行 LINQ 连接。我在下面添加了示例代码来说明需要如何执行方法。
第二个选项,也是我们试图摆脱的是在 SQL 端实现连接,让我们所有的调用都必须来自 SQL SP,它们将在安全结果上进行连接,并且不允许业务完整使用 NHibernate 功能的代码。
public IList<Product> GetAllByName(string FirstLetter) {
ICriteria GetAllCriteria = this.session.GetISession().CreateCriteria(typeof(Product));
GetAllCriteria.Add(NHibernate.Criterion.Restrictions.Like("ProductName", FirstLetter));
GetAllCriteria.AddOrder(NHibernate.Criterion.Order.Asc("ProductName"));
// Here would go the Threading for the both calls
IList<Guid> AllowedItems = SecurityBase.GetAllowedItemsForCurrentUser();
IList<Product> AllProducts = GetAllCriteria.List<Product>();
var ResultSet = from Prod in AllProducts
join Sec in AllowedItems on Prod.Id equals Sec
select Prod;
return ResultSet.ToList<Product>();
}
现在我的问题是,对于行级安全来说,这是一种糟糕的方法/做法吗(请记住,我们的安全模型确实很复杂且可定制——这是由业务设计决定的),还是我们正在朝着正确的方向前进?我们还有其他选择吗?
提前致谢,克莱顿
最佳答案
我目前正在从事具有类似要求的项目。这是一个未开发的项目,尚未编写代码,我们只是在寻找基于行的安全性的解决方案。
我会向您推荐这两篇文章:
http://www.codeproject.com/KB/database/Modeling_DAGs_on_SQL_DBs.aspx http://www.codeproject.com/KB/database/AFCAS.aspx
关于您的线程想法,使用 System.Threading 会给您带来麻烦,看看 Ritcher 的 AsyncEnumerator 或 Microsoft Concurrency runtime (CCR)
关于c# - 实现行级安全性——(SP 与 LINQ to Objects),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571703/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!