2016-12-12 2 views
1

사용자 액세스 권한에 따라 기능이있는 패널을 만들려면 사용자 정의 권한 기반 인증을 사용하고 있습니다. 사용자 클레임은 캐시 ICashClient에 저장됩니다. 특정 메뉴는 특정 컨트롤러 메소드를 참조하기 만합니다.PostSharp AOP를 사용하여 메소드 사용 권한 부여

문제 : 특정 방법에 대한 직접 링크를 입력하기 만하면 액세스 권한 누락으로 인해 사용할 수없는 방법을 사용할 수 있습니다.

제 아이디어는 특정 방법을 태깅하여 허용되지 않은 실행을 방지 할 수 있도록 애스펙트를 만드는 것입니다.

OnEntry 메서드에서 다시 인증하고 싶습니다.

다음 예에서는 서번터에 대한 요청이 Ajax인지 여부를 확인할 수 있습니다.

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

무엇 possiblities 나는 현금에서 기존 데이터를 조회하려면이 OnEntry 방법의 맥락에서해야합니까? 어떻게이 현금을 거기에서 액세스 가능하게 만들 수 있습니까?

편집 :

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의 인스턴스에 액세스하려고합니다.

프레임 워크가 aspect 생성과 수명을 제어 할 수 없기 때문에, aspect의 종속성은 의존성 삽입 프레임 워크에 의해 자동으로 해결 될 수 없다. 그러나 여러 측면에서 종속성을 사용할 수있는 방법이 많이 있습니다. 이 문서 섹션에서 설명합니다. 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() 
    { 
    } 
} 
관련 문제