2017-12-29 24 views
0

私は、ロールに基づいて自分のコンテキストを動的に承認する方法を理解しようとしています。Db一般的なリソース権限

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; 
    } 
} 

私の質問では、私のクエリ可能性を適用した後、どのようにこれをセットのデフォルトのクエリ可能にすることができますか?

私は古いDbSet here

を動作しますが、ネットコアはIDBSet

どのように私はカスタムdbsetを作成することができ、またはどのように私は、既存のdbSetをフィルタリングすることができますが含まれていないgystを見つけましたか?

+0

@SlavaUtesinovはそのまだ省と連携し、変更の追跡などに接続します、これをフィルタリングするための簡単な方法があるはずのように私は感じて、私は私の必要 –

答えて

1

より良いアプローチはglobal filtersを経由してあります。

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

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

を設定しましたコンテキストを使用してこれをデフォルトでフィルタリングします。したがって、開発者はコンテキストをフィルタリングすることを覚えておく必要はありません。しかし、通常はうまくいくかもしれません。1 –

+0

この場合、_global filters_を使用すると、更新された答えを見ることができます。 –

+0

ありがとう、私は今夜これを調べます。私は余分な依存関係を含めることを好むでしょうが、もしこれがうまくいけばそれは機能します。私はこれが今夜正しいことをマークします –

関連する問題