2016-12-12 5 views
1

私は、ユーザーのアクセス権に応じて機能を持つパネルを作成するために、カスタムクレームベースの承認を使用しています。ユーザークレームはキャッシュICashClientに保存されます。 特定のメニューは特定のコントローラーメソッドを参照するだけです。PostSharp AOPを使用してメソッドの使用を承認する

問題: 特定のメソッドへの直接リンクを入力するだけでアクセス権が失われているため、利用できないと思われるメソッドを使用することは可能です。

私の考えは、これらの特定のメソッドをタグ付けして、それらを実行不可能にしないようにすることです。

もう一度OnEntryメソッドで承認します。

以下の例では、サーブサーへのリクエストがAjaxであるかどうかを確認することができます。私は現金から既存のデータを照会するために、このOnEntry方法の文脈の中で持っているかどうpossiblities

public override void OnEntry(MethodExecutionArgs args) 
     { 

      var controller = args.Instance as MyController; 

      if (controller != null) 
      { 

       if (!controller.Request.IsAjaxRequest()) 
        throw new Exception ($"{args.Method.Name} invalid AJAX request"); 
      } 

      base.OnEntry(args); 
     } 

? この現金をそこからアクセスできるようにするにはどうすればよいですか?

編集:

public TResult ExecuteWithCache<TResult>(ICustomQuery<TResult> query) 
     { 
      try 
      { 
       //class for creating fingerprint of query 
       var customQueryHash = (ICustomQueryHash<TResult>)query; 

       //fingerprint of the query 
       var queryString = customQueryHash.GetQueryHash();  

       //cash which might holds data 
       var cachedResult = _cacheClient.Get<TResult>(queryString); 




       ... 
      } 
      catch(){} 


    } 

_cashClient拡張ICashClientの実装です: 私のコントローラメソッドを次のようしている要求されたデータを取得するためにそう呼ばれるQueryProcessor(依存性注入を使用)を使用します。

+0

現時点でコードからキャッシュにアクセスする方法の例を教えてください。 –

+0

更新された説明 –

答えて

1

私はカスタムアスペクトクラスの依存関係にアクセスする必要があることを理解しています。この依存関係は、通常、依存関係注入を使用して解決されます。この特定のケースでは、QueryProcessorのインスタンスにアクセスする必要があります。

フレームワークがアスペクト構築とライフタイムのコントロールを持たないため、アスペクトの依存関係は依存性インジェクションフレームワークによって自動的に解決されません。しかし、側面の中の依存関係を消費するために利用可能な多くのアプローチがあります。これらは、このドキュメントのセクションで説明されています。http://doc.postsharp.net/consuming-dependencies

以下は、側面からの依存関係を消費するいくつかの方法の簡単な説明です。プロジェクトと使用している依存関係フレームワークに基づいて最適なアプローチを選択できます。

Global service locator. DIフレームワークは通常、特定のインスタンス(たとえばcontext.GetInstance<T>())の現在のオブジェクトグラフを照会する方法を提供します。

public override void OnEntry(MethodExecutionArgs args) 
{ 
    var queryProcessor = ServiceLocator.GetInstance<IQueryProcessor>(); 
} 

Global composition container。一部のDIフレームワークでは、の後に新しいオブジェクトの依存関係をに満たして初期グラフを作成することもできます。アスペクトインスタンスの初期化時に依存関係をインポートするために、アスペクトでRuntimeInitializeメソッドをオーバーライドすることができます。

[PSerializable] 
public class MyAspect : OnMethodBoundaryAspect 
{ 
    [Import] 
    public IQueryProcessor QueryProcessor { get; set; } 

    public override void RuntimeInitialize(MethodBase method) 
    { 
     ServiceInjector.BuildObject(this); 
    } 
} 

Import dependencies from the target object。依存関係がターゲットオブジェクトのプロパティまたはフィールドに格納されている場合は、[ImportMember]アドバイスを使用して依存関係をインポートできます。この場合、あなたの側面はIInstanceScopedAspectを実装しなければなりません。

[PSerializable] 
public class MyAspect : OnMethodBoundaryAspect, IInstanceScopedAspect 
{ 
    [ImportMember("QueryProcessor", IsRequired = true)] 
    public Property<IQueryProcessor> QueryProcessor; 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     this.QueryProcessor.Get().ExecuteWithCache(/* ... */); 
    } 

    object IInstanceScopedAspect.CreateInstance(AdviceArgs adviceArgs) 
    { 
     return this.MemberwiseClone(); 
    } 

    void IInstanceScopedAspect.RuntimeInitializeInstance() 
    { 
    } 
} 
関連する問題