是否可以实现授权的DbContext



给定一个DbContextClientContext(关于用户的自定义会话数据(,是否可以创建一个"授权"的DbContext:其中每个"表"上只有行的子集可用?

使用授权的DbContext,我正在尝试实现中心行级别的授权。

我对它进行了一些研究,筛选出DbSet的唯一方法是使用类似Queryable.Where的东西,但它会返回IQueryable<T>,而且似乎没有返回筛选后的DbSet<T>的方法(除了可以在Startup中设置的全局查询,但它们无法访问像ClientContext这样的注入依赖项(。

是否可以通过像ClientContext这样的注入作用域依赖来定义DbSet<T>授权过滤器?

有模型级查询过滤器:https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0#model-级别查询过滤器

来自链接:

此功能允许LINQ查询谓词(布尔表达式通常传递给LINQ Where查询运算符(直接在元数据模型中的实体类型上(通常在OnModelCreating(。此类过滤器自动应用于任何LINQ涉及这些实体类型的查询,包括实体类型间接引用,例如通过使用Include或direct导航属性引用。

链接示例:

public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public int TenantId { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>().HasQueryFilter(
p => !p.IsDeleted
&& p.TenantId == this.TenantId);
}
}

您可以将其用于简单的场景。您可以在DbContext中定义实例属性,并在OnModelCreating中为要筛选的任何实体指定HasQueryFilter。该属性是一个实例属性,因此如果您有一个作用域DbContext,则会使用该请求中的正确属性值,如果您想通过UserContext中的内容进行筛选,这很方便。我个人从来没有尝试过,所以我不知道它允许你的实现有多复杂,但你可以玩它。

我不确定EF和EF核心,但我们将DbContext抽象为功能特定的"逻辑"块。

例如:

class DbContext()
{
public DbSet<PeopleEntity> peoples;
}
class PeopleLogic()
{
DbContext _context;
PeopleLogic(DbContext context)
{
_context = context;
}
IEnumerable GetAllPeoples()
{
// create context,
// apply filters
// return result
}
}

我们当然有一个简单CRUD操作的基础;

public void AddOrUpdate(){
lock (SyncDatabaseWriteObject)
{
try
{
using (var context = CreateContext())
{
//insert the entity and add it to the db context
context.Set<TEntity>().AddOrUpdate((TEntity)entity);
context.SaveChanges();
}
return entity;
}
catch (Exception ex)
{
throw new DatabaseAccessException("Error occured while getting saving.", ex);
}
}
}

我们传递的不是dbcontext,而是逻辑。

例如,我们将数据库的逻辑和对数据库的访问划分为两个独立的项目,然后业务层只使用dbAccess层。

最新更新