3

サービス クラスの各メソッドを制御できる 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>{}

私が必要とするのは、メソッドレベルにも属性を配置し、管理者だけがサービスのこのメソッドを実行する権利を持つように認証を行うことです。しかし、この属性を Delete メソッドに配置すると、機能せず、カスタム フィルター属性がヒットしません。クラス レベルの属性呼び出しのみが機能します。

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

メソッドレベルから許可/フィルター属性を設定することは可能ですか? はいの場合、どうすればこれを実装できますか?

4

1 に答える 1

2

いいえ、メソッドに追加することはできません。これをサービス クラスまたは Request DTO に追加し、ApplyToメソッド フィルターを使用して、どのメソッドに適用する必要があるかを servicestack に伝えることができます。

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

これをサポートするRequest Filter 属性の例については、 [RequiredRole]および[RequestPermission]属性の実装を参照することもできます。

于 2012-05-17T04:47:53.767 に答える