我正在编写一个 Rest API 框架,我想创建一个数据库授权上下文。 上下文接受角色解析器并使用它来过滤默认集。基于一组规则。
在我的第一次尝试中,我想也许我可以将默认过滤器应用于实体集以禁止访问某些资源
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;
}
}
但这不会编译 I,因为我无法转换我的 Queryable
返回filteredDBSet
.
我发现了一些关于 Secure data 不同方式的文章在 EF-Core 中,但使用此方法需要,这不是我想要保护数据的方式。
- 我希望我的上下文能够根据角色隐式保护数据 (这样任何使用上下文的用户都不必担心 包装他们的查询以检查授权。)
- 为用户提供大量额外配置
我有一个函数,它已经根据 SQL 的元数据生成我的表达式。我的问题是申请过滤到 DBSet
s。
假设您获得 Expression<TEntity, Bool>
如何保护我的上下文,以便用户只能访问或修改我决定的数据?
最佳答案
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 .
请注意,当前全局查询过滤器有一些限制和特殊要求,需要 Root 于 DbContext
派生类,如果它们需要动态等( EF Core: Soft delete with shadow properties and query filters )。我很确定它们会随着时间的推移而得到改进,但最好检查一下当前的功能是否可以满足您的需求。
关于c# - EF Core 中的数据库资源授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48036547/