我目前正在开展一个我们希望实现以下目标的项目:
假设我们有一个名为products的表:
[Id] [Title] [Description] [AccessRights]
现在我们要做的是创建一个返回IQueryable的方法,该方法仅在特定用户(输入参数)位于AccessRights列下的组中时公开该表的数据。
因此,假设我们有一个用户Devedse和一个用户TestMan。用户Devedse在“PowerUsers”组中。用户TestMan不在哪里。我们想要为用户TestMan请求所有产品,我们不应该使用AccessRight'PowerUsers'获得任何产品。
现在我们可以在C#中实现这一点,但我们宁愿使用SQL中的函数来实现它,因此我们不必在确定用户可以访问哪些行之前先检索所有数据。
这样的事情:
public IQueryable GetProducts(string user)
{
return dbContext.Products.ExecuteStoredProcedure(user);
}
我们目前在函数中使用IS_MEMBER()函数实现了这个功能,然后通过视图公开。遗憾的是,这不支持输入(View也不支持输入参数)。 IS_MEMBER函数将简单地检查当前用户是否是该组的成员,因此要求我们使用模拟或EXECUTE AS。 (然后要求所有域用户基本上都对数据库具有读访问权限。我宁愿不做的事情。)
有谁知道我们如何才能实现这一目标?
编辑:我们公开的IQueryable仍然可以与其他查询一起使用也很重要。 (LINQ通常会为IQueryable上的LINQ查询执行处理,以便最终的SQL查询在处理之前不必首先获取所有数据。)
Edit2:想一想,最理想的情况是EntityFramework会产生某种类似的SQL:
select * from Products WHERE @param1.IsMemberOf(AccessRights)
我不确定这是否可行?