我正在编写Rest API Framework,我想创建一个db授权上下文。 上下文接受角色解析器并使用它来过滤默认集。基于一套规则。
在我的第一次尝试中,我想也许我可以对实体集应用默认过滤器以禁止访问某些资源
public class AuthorizationContext : DbContext
{
protected IConstraintResolver _constraintResolver;
public AuthorizationContext(IConstraintResolver constraintResolver)
{
this._constraintResolver = constraintResolver;
}
public override DbSet<TEntity> Set<TEntity>()
{
var defaultSet = base.Set<TEntity>();
var constraints = this._constraintResolver.GetConstraintsForTypeByRole<TEntity>();
var filteredSet = base.Set<TEntity>().AsQueryable();
foreach (var constraint in constraints)
{
filteredSet = filteredSet.Where(constraint);
}
//how do I apply this back to the innerQueryable
return filteredSet;
}
}
但这不会编译我,因为我无法将Queryable
转换回filteredDBSet
。
我在EF-Core中找到了一些关于Secure data的不同方法的文章,但使用这种方法需要的不是我想保护数据的方式。
我有一个函数已经根据SQL的元数据生成了我的表达式。我的问题是申请过滤到DBSet
s。
假设您获得Expression<TEntity, Bool>
如何保护我的上下文,以便用户只能访问或修改我已决定的数据?
答案 0 :(得分:2)
Expression<TEntity, bool>
听起来像是EF Core 2.0的合适人选Global Query Filter。
您可以为特定实体设置它:
modelBuilder.Entity<SomeEntity>().HasQueryFilter(expression);
或基于某些标准的多个实体 - 示例为EF-Core 2.0 Filter all queries (trying to achieve soft delete)和ef core 2 apply HasQueryFilter for all entity。
请注意,目前全局查询过滤器有一些限制和特殊要求,如果它们需要是动态的等等DbContext
派生类(EF Core: Soft delete with shadow properties and query filters)。我确信它们会随着时间的推移而得到改进,但检查当前功能是否可以满足您的需求是很好的。