2

私はRest API Frameworkを作成していますが、私はdb認証コンテキストを作成したいと思います。 コンテキストはロールレゾルバを取り、それを使用してデフォルトセットをフィルタリングします。一連のルールに基づいています。私は多分、私がEFコアの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; 
    } 
} 

特定のリソースへのアクセスを禁止する設定が、私はfilteredDBSetに私のQueryable背中を変換することができないので、これは私をコンパイルしていないエンティティにデフォルトのフィルタを適用できると思っていた私の最初の試みで、

私はEF-CoreのSecure dataへのいくつかの記事をいくつか見つけましたが、この方法を使用するにはデータを保護する方法が必要ではありません。

  1. は、私は私のコンテキストが暗黙のうちに安全なデータ役割 をオフに基づいてしたい(コンテキストを使用して、任意のユーザーが承認をチェックするのに約 wrapingそのクエリを心配する必要はありませんように。)
  2. 追加の多くをユーザーの構成

SQLのメタデータに基づいて式を生成する関数があります。私の問題はDBSetにフィルターに適用されています。

あなたにはExpression<TEntity, Bool>が与えられていると仮定します。ユーザーが私が決定したデータにしかアクセスまたは変更できないように、コンテキストを保護するにはどうすればよいですか?

+0

EFC 2.0 [グローバルクエリフィルタ](https://docs.microsoft.com/en-us/ef/core/querying/filters) –

+0

あなたはEntityframework plusのものを参照していますか?私はそれらがef7で動作しないと思った? –

+0

いいえ、リンクからわかるように、これらはEFコアの一部です。 –

答えて

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)。私はかなり時間をかけて改良されると確信していますが、現在の機能があなたのニーズに合っているかどうかを確認することは良いことです。