【发布时间】:2011-12-20 22:58:40
【问题描述】:
我在 BL 和实体框架 DAL 之间创建了中间件层,用于通过应用程序中的用户权限业务逻辑过滤数据。我的图层实现了具有“无过滤 ObjectSet”实例的 IObjectSet,并且只要使用 ObjectSet,过滤器表达式就会运行。所有工作炉排,而不是“包括”方法。我找到了一个解决方案,该解决方案创建了一个将“无过滤 ObjectSet”转换为 ObjectQuery 并使用 ObjectQuery.Include 方法的扩展方法,但此解决方案可能会导致绕过权限过滤。
public IQueryable<TEntity> Include<TJoin>(string path)
{
if (_nonAuthorizedObjectSet is ObjectQuery<TEntity>)
{
var result = ((ObjectQuery<TEntity>)_nonAuthorizedObjectSet).Include(path);
return result as IQueryable<TEntity>;
}
}
例如:
表名“Items”有列 {Item_Id,Owner,Item_Type_Id} 该表有一个权限逻辑,用户只能看到 Owner==user 的项目。 表“Item_Types”没有权限逻辑。
通过这样做: 允许的 DAL。 Items.ToArray() – 仅获取 current_user==Owner 的项目。 Item_Types.Include("项目") 问题!! - 我得到了所有的东西。
谢谢
【问题讨论】:
-
我把你的问题看了三遍,没看懂。示例中的
User_Types是什么?你想过滤什么?主要实体还是包含(急切加载)的实体? -
好的,我修复了这个例子,我想过滤包含的实体。但问题是过滤需要在 ObjectSet 中而不是在 BL 中。 "Item_Types.Include("Items")" 行必须只返回过滤后的项目。
标签: security entity-framework data-access-layer expression-trees objectquery