2016-10-05 11 views
1

私は自分でIRuntimePolicyを実装したいと思います。私は与えられた例に従っていますが、私たちのデータベースにアクセスする必要があります。そうしないと、UserSessionオブジェクトを注入することができません。GlimpseSecurityPolicyの注入

実行時にセキュリティオブジェクトが作成されるのはいつですか?これは可能ですか?私は例を見つけませんでした。

Ninject 3.2.3を使用しています(または最新のMVC 5が利用可能です)。 DependencyResolver.Current.GetService<IThing>()を使用する:

私は最終的に

public class GlimpseSecurityPolicy : IRuntimePolicy 
    { 
     private readonly IAclManager aclManager; 
     private readonly IUserSession userSession; 

     public GlimpseSecurityPolicy(IUserSession userSession, IAclManager aclManager) 
     { 
      this.userSession = userSession; 
      this.aclManager = aclManager; 
     } 

     public RuntimeEvent ExecuteOn 
     { 
      // check policy when request ends and when executing a resource (like glimpse.axd) 
      get { return RuntimeEvent.EndRequest | RuntimeEvent.ExecuteResource; } 
     } 

     public RuntimePolicy Execute(IRuntimePolicyContext policyContext) 
     { 
      if (!this.aclManager.IsUserAllowed(UserAction.AccessGlimpse, this.userSession.GetUser())) 
      { 
       return RuntimePolicy.Off; 
      } 

      return RuntimePolicy.On; 
     } 
    } 
+1

私はしばらく前にこれを試してみましたどこにも行かない、私はそれラウンドを取得するためにサービスロケータパターンを使用して終了。 'DependencyResolver.Current.GetService ()'また、起動時またはglobal.asaxでdependancyresolverが必要になります。これは偉大ではない、私は代替を見ることを愛するだろう –

+0

@ LukeMcGregor私は同じ構造で終わった。 – Santhos

答えて

0

のようなものを想像し、我々は唯一の選択肢を思い付きました。

コード結果は、その後、簡単かつ醜いです:

public class GlimpseSecurityPolicy : IRuntimePolicy 
    { 
     public RuntimeEvent ExecuteOn => RuntimeEvent.EndRequest | RuntimeEvent.ExecuteResource; 

     public RuntimePolicy Execute(IRuntimePolicyContext policyContext) 
     { 
      var aclManager = DependencyResolver.Current.GetService<IAclManager>(); 
      var userSession = DependencyResolver.Current.GetService<IUserSession>(); 

      if (!aclManager.IsUserAllowed(UserAction.AccessGlimpse, userSession.GetUser())) 
      { 
       return RuntimePolicy.Off; 
      } 

      return RuntimePolicy.On; 
     } 
    }