2012-05-16 3 views
2

서비스 클래스의 각 메서드를 제어 할 수있는 ServiceStack 서비스의 사용자 지정 특성을 만들려고합니다.ServiceStack에 대한 사용자 지정 특성

이것은 구현중인 속성 클래스입니다.

[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class , Inherited = false, AllowMultiple = false)] 
public class MyRequestFilterAttribute:RequestFilterAttribute 
{ 

    public string Provider { get; set; } 

    public MyRequestFilterAttribute(ApplyTo applyTo): base(applyTo) 
    { 
     this.Priority = (int) RequestFilterPriority.Authenticate; 
    } 

    public MyRequestFilterAttribute():this(ApplyTo.All) 
    { 

    } 

    public MyRequestFilterAttribute(ApplyTo applyTo, string provider): this(applyTo) 
    { 
     this.Provider = provider; 
    } 

    public MyRequestFilterAttribute(string provider): this(ApplyTo.All) 
    { 
     this.Provider = provider; 
    } 

    public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto) 
    {} 
} 

내가 클래스 수준에서 속성을 배치 할 때 방법에 대한 제어를 얻을 수 있어요 서비스 클래스

[MyRequestFilter(ApplyTo.All)] 
public class TodoService : RestServiceBase<Todo> 
{ 
    public TodoRepository Repository { get; set; }     
    public override object OnGet(Todo request) 
    { 
     if (request.Id == default(long)) 
      return Repository.GetAll(); 

     return Repository.GetById(request.Id); 
    } 
    public override object OnPost(Todo todo) 
    { 
     return Repository.Store(todo); 
    } 
    public override object OnPut(Todo todo) 
    { 
     return Repository.Store(todo); 
    } 
     [MyRequestFilter("Admin")] 
    public override object OnDelete(Todo request) 
    { 
     Repository.DeleteById(request.Id); 
     return null; 
    } 
    public object GetDetailsofALL() 
    { 
     return null; 
    } 
} 

입니다. 내가 필요로 무엇 즉

[MyRequestFilter(ApplyTo.All)] 
public class TodoService : RestServiceBase<Todo>{} 

뿐만 아니라 메소드 수준에서 속성을 배치하고 단지 관리자가 서비스의이 방법을 수행 할 수있는 권한을 갖도록 일부 인증을하는 것입니다. 그러나이 특성을 삭제 메서드에 배치하면 작동하지 않고 사용자 지정 필터 특성이 손상되지 않습니다. 클래스 수준 특성 호출 만 작동합니다.

[MyRequestFilter("Admin")] 
public override object OnDelete(Todo request){} 

메소드 수준에서 권한/필터 속성을 설정할 수 있습니까? 그렇다면 어떻게 구현할 수 있습니까?

답변

1

아니요 메서드에 추가 할 수 없습니다. 당신은 서비스 클래스 또는 요청 DTO에 추가하고 예를 들어이 적용되어야 방법 servicestack, 이야기하는 ApplyTo 방법 필터를 사용할 수 있습니다

[MyRequestFilter(ApplyTo.All)] 
[MyRequestFilter(ApplyTo.Delete, "Admin")] 
public class TodoService : RestServiceBase<Todo> { ... } 

당신은 또한 [RequiredRole]의 구현을 참조 할 수 있습니다 및 이것을 지원하는 Request Filter attributes의 예제에 대한 속성은 [RequestPermission]입니다.

+0

고마워. 나는 전에 링크를 통해 갔었지만 방법 수준에서 어떤 일을 할 수 있는지 전혀 알고 싶지 않았습니다. – Manek

관련 문제