【问题标题】:problame filtering ObjectQuery.Include method fo permission business logic问题过滤 Object Query.Include 权限业务逻辑方法
【发布时间】: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


【解决方案1】:

EF 不支持过滤预先加载的记录(包括)。只能过滤主要记录。如果您需要过滤关系,您必须对每个关系使用自定义投影或单独查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2019-12-11
    • 2011-11-05
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多