【问题标题】:Db Generic Resource AuthorizationDb 通用资源授权
【发布时间】:2017-12-31 03:27:12
【问题描述】:

我试图弄清楚如何根据角色动态授权我的上下文。

public interface IConstraintResolver
{
    Expression<Func<TEntity, bool>>[] GetConstraintsForTypeByRole<TEntity>() 
        where TEntity : class;
}
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;
    }
}

我的问题是,在应用我的可查询对象后,如何将其设为 Set 的默认可查询对象。

我找到了一个适用于旧 DbSet here 的 gyst

但是 .Net Core 不包含 IDBSet

如何创建自定义 dbset,或者如何过滤现有 dbSet?

【问题讨论】:

  • @SlavaUtesinov 仍然可以保存和连接到更改跟踪器等。我觉得应该有一种简单的方法来过滤这个集合

标签: c# entity-framework authorization .net-core filtering


【解决方案1】:

global filters 有更好的方法:

public class AuthorizationContext : DbContext
{
    static AuthorizationContext()
    {
         QueryFilterManager.Filter<Orders>(q => q.Where(x => x.Price <= 5000));
    }

    public AuthorizationContext()
    {
         QueryFilterManager.InitilizeGlobalFilter(this);
    }
}

【讨论】:

  • 我需要我的上下文来默认过滤这个。所以开发者不需要记住过滤上下文。但通常这可能会起作用,所以加上 1
  • 好的,在这种情况下,您可以使用全局过滤器,查看更新后的答案。
  • 谢谢,今晚我会调查此事。我更愿意包含一个额外的依赖项,但如果这项工作有效。如果是这样,我今晚会标记它是正确的
  • 我通常倾向于自己写东西,但这个库会为我节省大量时间,谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2017-07-20
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多